티스토리 뷰

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12981

 

풀이

 

단어를 차례대로 확인해가면서 주어진 조건에 어긋나는 경우만 찾아주면 쉽게 해결할 수 있는 문제였다.

 

나는 for문을 이용해 풀었고, 그 안에 두 가지 조건을 판단하는 구문만 추가하였다.

 

먼저, 같은 단어를 말하는 경우엔 count를 이용하여 판단해주었다.

 

말한 단어를 담고 있는 배열의 count와 Set의 count를 비교한다면, 중복되는 단어가 있는 경우에 다를 것이다.

 

다음으로 잘못된 단어를 말한 경우이다.

 

이전 단어의 마지막 캐릭터와 새로운 단어의 첫번째 글자를 비교해서 다른 경우에도 return을 해주었다.

 

이때, 첫번째 순서인 경우에는 비교할 것 없이 값만 바꿔주면되기때문에 아예 프로퍼티들의 값을 첫번째 단어로 설정하고 두번째 단어부터 진행하였다.

 

두 조건을 다 통과하면 다음 순서로 가기 때문에 player에 1을 더해주었고, 이때 n보다 커졌을 경우엔 한 바퀴를 돈 것이므로 turn에 1을 더해주었다.

 

마지막으로 아무 문제 없이 끝말잇기가 끝난다면 [0,0]을 return 하도록 해주었다.

 

func solution(_ n:Int, _ words:[String]) -> [Int] {
    
    let firstWord = words[0]
    var last = firstWord.last!
    var player = 2
    var turn = 1
    var used = [firstWord]
    
    for i in 1..<words.count {
        used.append(words[i])
        //반복된 단어가 들어가면 count가 다를것임
        if used.count != Set(used).count {
            return [player, turn]
        }
        
        //잘못된 단어 말한경우
        if last != words[i].first! {
            return [player, turn]
        }
        last = words[i].last!
        
        player += 1
        if player == n + 1 {
            player = 1
            turn += 1
        }
    }
    return [0,0]
}

 

 

결론

 

어렵지않게 해결한 문제이지만 효율적으로 보이지는 않는다. 

 

첫번째 단어의 값들을 미리 선언하는 과정에서도 시간이 쓰였을텐데, 굳이 저럴필요없이 인덱스 - 1로 접근해도 될 것 같다.

 

직접 해보니 시간이 줄어든 케이스도 있고 늘어난 케이스도 있었다.

 

 

댓글
최근에 올라온 글
Total
Today
Yesterday