반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "프로그래머스(Lv.2) - 영어 끝말잇기" 문제를 풀었습니다.

 


 

Github

 

GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

github.com

 

문제 링크

 

코딩테스트 연습 - 영어 끝말잇기

3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3,3] 5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0,0]

programmers.co.kr

 


풀이

이번 문제는 문자열 문제입니다.

매번 String을 Array로 바꿔서 사용하다보니 index로 참조하는 게 낯설더라고요.

그래서 이번에는 index도 사용해서 해보았습니다.

 

종료 조건은 두 가지 입니다.

1. 기존에 이미 단어인가

2. 앞 단어의 끝 글자와 현재 단어 첫 글자가 다른가

 

종료 조건이 명확하므로 문제는 쉽게 해결됩니다.

 

1번 조건은 Directory를 이용해 해결했습니다.

Array의 contains()가 O(n)의 시간복잡도를 가지는데

반면 Directory를 이용하면 O(1)의 시간복잡도로 체크할 수 있기 때문입니다.

물론 이 문제에서는 큰 상관 없지만요!

 

2번 조건은 startIndex와 endIndex를 이용했습니다.

주의해야 할 점은 endIndex가 문자열의 끝 단어가 아닌 \0을 가리킨다는 것입니다.


      
string.index(before: string.endIndex)

따라서 위 코드처럼 사용해야 합니다.

 

사실 이 문제에서는 first와 last를 사용하면 간편하게 해결할 수 있습니다.

전 굳이 index를 써서 풀어본거에요.

 

감사합니다!

 


전체 코드


      
import Foundation
func solution(_ n:Int, _ words:[String]) -> [Int] {
var answers: [String: Int] = [:]
var count = 0, person = 0
answers.updateValue(1, forKey: words[0])
for i in 1..<words.count {
// let startIndex = words[i].startIndex
// let endIndex = words[i-1].index(before: words[i-1].endIndex)
if answers[words[i]] == 1 || (words[i-1].last! != words[i].first!) {
return [i%n + 1, i/n + 1]
}
answers.updateValue(1, forKey: words[i])
}
return [0, 0]
}

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형
유정주