import Foundation
func solution(_ n: Int, _ words: [String]) -> [Int] {
var numOfTurn = 0
var numOfCycle = 0
var beforeWord: [String] = []
for (idx, value) in words.enumerated() {
if idx == 0 {
beforeWord.append(value)
continue
}
if beforeWord.contains(value) { // 이미 나왔던 단어면 실패 !
let tmp = (idx + 1) % n
numOfTurn = tmp == 0 ? n : tmp
numOfCycle = tmp + ((idx + 1) / n)
break
}
if beforeWord.last?.last != value.first {
let tmp = (idx + 1) % n
numOfTurn = tmp == 0 ? n : tmp
numOfCycle = tmp + ((idx + 1) / n)
break
}
beforeWord.append(value)
}
return [numOfTurn, numOfCycle]
}
채점결과 (으악)
정확성: 45.0
합계: 45.0 / 100.0
반례를 참고하니
INPUT : 3, ["aba","aba","baa"]
EXPECTATION : [2,1]
내코드 출력 : [2,2]
그니까 이게 numOfCycle
계산식이 문제였던 것이다.
현재는 numOfCycle = tmp + ((idx + 1) / n)
로 되어있는데 좀 이상하긴했다.
현재 턴의 사람이 몇 번째로 말하는지를 알아내는 것이니까 일단 차례대로 한번 써봤다.
간단 예시
피그마로 세상허접한 자료를 만들어봤다
다음과같은 idx와 상관관계가 있는것을보고 idx에 싸이클 수는 사람 수만큼 지났을때 카운팅 되는 것이기 때문에,
(idx/사람수)+1
로 훨씬 간결하게 변경해주었더니 해결될 수 있었다.
import Foundation
func solution(_ n: Int, _ words: [String]) -> [Int] {
var numOfTurn = 0
var numOfCycle = 0
var beforeWord: [String] = []
for (idx, value) in words.enumerated() {
if idx == 0 {
beforeWord.append(value)
continue
}
if beforeWord.contains(value) { // 이미 나왔던 단어면 실패 !
let tmp = (idx + 1) % n
numOfTurn = tmp == 0 ? n : tmp
numOfCycle = (idx / n) + 1
break
}
if beforeWord.last?.last != value.first {
let tmp = (idx + 1) % n
numOfTurn = tmp == 0 ? n : tmp
numOfCycle = (idx / n) + 1
break
}
beforeWord.append(value)
}
return [numOfTurn, numOfCycle]
}
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
아무리봐도 현재 코드가 너무 번잡하다
1. 일단 코드가 중복되는 부분을 해소했다.
if beforeWord.contains(value) || beforeWord.last?.last != value.first { // 이미 나왔던 단어면 실패 and 끝말잇기 실패
let tmp = (idx + 1) % n
numOfTurn = tmp == 0 ? n : tmp
numOfCycle = (idx / n) + 1
break
}
numOfTurn = (idx%n)+1
let tmp = (idx + 1) % n
numOfTurn = tmp == 0 ? n : tmp -> X
numOfTurn = (idx%n)+1 -> 개선안
if beforeWords.isEmpty {
beforeWords.append(word)
continue
}
최종 코드
import Foundation
func solution(_ n: Int, _ words: [String]) -> [Int] {
var beforeWords: [String] = []
for (idx, word) in words.enumerated() {
if beforeWords.isEmpty {
beforeWords.append(word)
continue
}
if beforeWords.contains(word) || beforeWords.last!.last != word.first {
let player = (idx % n) + 1
let turn = (idx / n) + 1
return [player, turn]
}
beforeWords.append(word)
}
return [0, 0]
}
느낀점