
1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.
tank → kick → know → wheel → land → dream → mother → robot → tank
위 끝말잇기는 다음과 같이 진행됩니다.
사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.
| n | words | result |
|---|---|---|
| 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] |
| 2 | ["hello", "one", "even", "never", "now", "world", "draw"] | [1,3] |
입출력 예 #1
3명의 사람이 끝말잇기에 참여하고 있습니다.
입출력 예 #2
5명의 사람이 끝말잇기에 참여하고 있습니다.
입출력 예 #3
2명의 사람이 끝말잇기에 참여하고 있습니다.
function solution(n, words) {
for(let i = 1; i< words.length; i++){
if(words[i-1].substr(-1) !== words[i][0])
return [i % n + 1, Math.ceil((i+1)/n)];
else{
for(let j = 0; j < i; j++){
if(words[i] === words[j])
return [i % n + 1, Math.ceil((i+1)/n)];
}
}
}
return [0,0]
}
문자의 맨 끝자리와 그 다음 문자의 첫자리가 같다면 그대로 그 사람의 순번과 몇번째 순서인지를 리턴해 주었고, 아니라면 문자의 중복을 검사한 다음 중복이 있다면 순번과 순서를 리턴해 주었다. 둘 다 아닌 경우에는 [0,0]을 리턴해 주었다.
function solution(n, words) {
let answer = 0;
words.reduce((prev, now, idx) => {
answer = answer || ((words.slice(0, idx).indexOf(now) !== -1 || prev !== now[0]) ? idx : answer);
return now[now.length-1];
}, "")
return answer ? [answer%n+1, Math.floor(answer/n)+1] : [0,0];
}
redue를 이용하여 풀어 주었다. answer에는 answer 값을 넣어 준다. 초기값이 0이므로 처음에는 다음으로 넘어 간다. slice()와 인덱스를 사용하여 words를 이전 문자까지 잘라준 다음, 현재 값이 존재하지 않는다면 answer에는 answer이 담기고 존재한다면 인덱스 값이 answer에 담긴다. 또한 만약 이전 값의 맨 뒷자리가 현재 값의 첫번째 글자와 같다면 그 인덱스가 answer에 담기고 아니라면 answer이 answer에 담긴다.
그리고 현재 값의 마지막 글자를 이전값에 넣어 준다.
그 후에 answer이 값이 0이라면 [0,0]을, 숫자가 있다면 순서와 순번을 리턴해 준다.