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배 빠르다는 것을 확인할 수 있다.
[코딩테스트] 프로그래머스 - LV2 최댓값과 최솟값구하기 (0) | 2023.10.31 |
---|---|
[알고리즘풀기] 백준 10815번 숫자카드 (0) | 2022.07.26 |
[알고리즘풀기] 백준 11720번 숫자의 합 구하기 (0) | 2022.07.19 |
댓글 영역