상세 컨텐츠

본문 제목

[코딩테스트] 프로그래머스 -LV2 영어 끝말잇기

iOS 캐기/Interview

by Atlas 2023. 11. 1. 12:48

본문

728x90
반응형

문제설명

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다.
영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.
1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.이전에 등장했던 단어는 사용할 수 없습니다.한 글자인 단어는 인정되지 않습니다.

다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.tank → kick → know → wheel → land → dream → mother → robot → tank위 끝말잇기는 다음과 같이 진행됩니다.
1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.3번 사람이 자신의 첫 번째 차례에 know를 말합니다.

1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.(계속 진행)끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.

사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.제한 사항끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.

words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.

단어의 길이는 2 이상 50 이하입니다.모든 단어는 알파벳 소문자로만 이루어져 있습니다.끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.

정답은 [ 번호, 차례 ] 형태로 return 해주세요.만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.

 

 

해결방법

핵심이 되는 로직들을 구현하기 위해 중요한 내용을 한번 더 정리해보고 시작해보자 

 

- 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다 -> String의 first, last 를 사용 

- 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다 -> Set, Array, contain을 사용 

 

 

import Foundation

func solution(_ n:Int, _ words:[String]) -> [Int] {
    
    if n < 2 && n > 10 { return [] }
    if words.count < 2 && words.count > 100 { return [] }
    
    print("\(n)명의 사람이 끝말잇기에 참여하고 있습니다.")

    var tmpSet = Set<String>()
    for (index,word) in words.enumerated() {
        
        if !tmpSet.isEmpty && tmpSet.contains(word)
            || !tmpSet.isEmpty && words[index-1].last != word.first {
            return [ index % n + 1 , index / n + 1  ]
        }
        tmpSet.insert(word)
    }
    return [0, 0]
}

 

Set<String> 을 사용하여 통과는 했지만 굳이 Set을 사용하기보다 Array를 썼어도 되었을것 같다. 

 

    var tmpArr = Array<String>()
    for (index,word) in words.enumerated() {
        
        if !tmpArr.isEmpty && tmpArr.contains(word)
            || !tmpArr.isEmpty && words[index-1].last != word.first {
            return [ index % n + 1 , index / n + 1  ]
        }
        tmpSet.append(word)
    }
    return [0, 0]

 

잠깐! 다른분들은 어떻게 풀이하셨는지 찾아보니 조건문을 아래와 같이 쓸 수도 있다는 것을 확인하였다. 

//AS-IS
words[index-1].last != word.first

//TO-BE
tmpArr.last!.last! != word.first!

 

 

테스트를 돌려보니 통과는 되었지만 시간에서 Set을 사용했을 때약 2배 빠르다는 것을 확인할 수 있다. 

 

Set을 사용한 경우(좌) VS Array를 사용한 경우(우)

 

 

 

반응형

관련글 더보기

댓글 영역