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]을, 숫자가 있다면 순서와 순번을 리턴해 준다.