https://school.programmers.co.kr/learn/courses/30/lessons/12981
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
규칙을 지키면서 구현하는 문제!
문제를 빠르게 풀려고 하다 보니... 좀 더 좋은 구현 방식을 생각하지 못하는 것 같다.
첫 번째 코드는 빠르게 풀려다 보니 조금 길어진...
func solution(_ n:Int, _ words:[String]) -> [Int] {
var dropout = 1
var count = 1
var set = Set<String>()
var last = words[0].first!
var final = false
for word in words {
if set.contains(word) { //중복 글자의 경우
final = true
break
}
if word.first! == last { //끝말잇기가 이어진다면
dropout += 1
last = word.last! //마지막 글자
set.insert(word)
}else {
final = true
break
}
if dropout == n + 1 {
count += 1
dropout = 1
}
}
if final == false {
return [0,0]
}
return [dropout, count] //가장 먼저 탈락하는 사람, 자신의 몇 번째 차례에 탈락하는지
}
여기서 중복 단어를 제외하기 위해 set을 사용했는데, 사실 배열을 사용해도 된다는 것을 다 풀고 나서 생각났다.
지금까지 나온 단어를 배열에 넣고 있는지만 체크하면 되는데(contain(_:)) ㅎㅎ...
dropout은 탈락자를 나타내는 변수다. 1~n번 사람을 돌아가면서 탈락자를 갱신해 주었다.
이전 단어의 뒷 글자와 현재 단어의 첫 글자가 동일한지 체크하고
- 동일: 마지막 글자를 담은 last를 갱신, dropout 갱신 (+1). 만약 마지막 N번의 사람이라면 1번으로 갱신
- 동일 x: 종료
모든 단어를 순회했음에도 끝나지 않았다면(중복 혹은 게임 탈락) [0,0] 출력!
다른 분들은 어떻게 코드를 구현했을까...
몇 가지 코드를 보니까 count, dropout을 따로 변수로 두고 하지 않고 현재 기록한 단어의 개수에서 n을 나눠주는 형식으로 진행했다.
4번째 단어를 보는 중이고, n = 3이라면 4 % 3 = 1. 1번 사람의 단어다!
8번째 단어를 보는 중이고, n = 3 이라면 8 % 3 = 2. 2번 사람의 단어고,
만약 여기서 게임이 종료된다면 2번 사람의 3번째 단어이므로 8 / 3 + 1 = 3
위의 방식을 보면서 다시 한번 더 코드를 짜봤다.
func solution(_ n:Int, _ words:[String]) -> [Int] {
var record = [String]()
var last = words[0].first!
for word in words {
if record.contains(word) || word.first! != last { //중복 글자 혹은 실패의 경우
return [(record.count % n + 1), (record.count / n + 1)]
}
last = word.last! //마지막 글자
record.append(word)
}
return [0, 0]
}
좀 더 깔끔한.. 코드 완성!
이런 규칙을 알아내려면... 여러 예제를 두고 생각해 봐야겠다! 큼큼
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Swift] 괄호 회전하기 (0) | 2022.12.29 |
---|---|
[프로그래머스/Swift] 예상 대진표 (0) | 2022.12.28 |
[프로그래머스/Swift] 다음 큰 숫자 (0) | 2022.12.27 |
[프로그래머스/Swift] 가장 가까운 같은 글자 (0) | 2022.12.26 |
[프로그래머스/Swift] 크기가 작은 부분 문자열 (0) | 2022.12.26 |