풀이
김영준
// 이전에 등장했던 단어를 말하면 탈락, 끝단어로 시작하는 단어를 말하지 않으면 탈락 // 사람의 수 n, 순서대로 말한 단어 words // [가장 먼저 탈락하는 사람의 번호, 몇 번째 차례에 탈락했는지] 순서로 리턴 // 만약 탈락자가 생기지 않으면 [0, 0] 리턴 function solution(n, words) { const prevWords = [words[0]]; const result = []; let num = 1; // 현재 사람의 번호 for(let i = 1; i < words.length; i ++){ // 현재 해당하는 사람의 번호를 지정 num = num < n ? num + 1 : 1; const prevWord = prevWords[prevWords.length - 1] // 직전 단어 const crtWord = words[i]; // 현재 단어 // 말한 단어가 등장했거나 직전 단어의 마지막 글자와 현재 단어의 첫 글자가 다를 때 탈락 if(prevWords.includes(crtWord) || prevWord[prevWord.length-1] !== crtWord[0] ){ result.push(num); result.push(Math.ceil((i + 1) / n)); // 두 번째 부터 시작했으니 i에 1을 더함 break; } // 등장 단어 배열에 현재 단어를 push prevWords.push(crtWord); } return result.length === 0 ? [0, 0] : result; }
이종현
function solution(n, words) { let answer = []; let arr = [words[0]]; for (let i = 1; i < words.length; i++) { let str = words[i]; if (arr.includes(str) || arr[arr.length - 1].at(-1) !== str[0]) { answer[0] = (i % n) + 1; answer[1] = Math.floor((i / n) + 1); break; } else { arr.push(str) } } if (answer.length === 0) { answer[0] = 0; answer[1] = 0; } return answer; }
박노철
function solution(n, words) { /* 말한 단어의 마지막 문자로 시작하는 단어를 말해야 한다. 이전에 등장한 말x, 한 글자 단어x, 가장 먼저 탈락하는 사람의 번호, 자신의 몇번째 차례에서 탈락하는지 , 탈락자가 없다면 [0,0]을 리턴 */ // 이전 단어의 끝자리로 시작되는가?, 이 단어가 이전에 나온적있는가? const dupleChecker=new Set(); let failedIndex=null; for(let i =0; i<words.length; i++){ const word=words[i]; //각 단어가 이전에 있는지 확인 if(!dupleChecker.has(word)){ dupleChecker.add(word); if(i===0)continue; else{ const preWord=words[i-1]; if(preWord[preWord.length-1]!==word[0]){ failedIndex=i; break; } } }else{ failedIndex=i; break; } } return failedIndex===null? [0,0]:[failedIndex%n+1,Math.floor(failedIndex/n)+1]
이민희
function solution(n, words) { const wordsLength = words.length let failIndex = -1 for (let i = 1; i < wordsLength; i++) { if (words[i][0] !== words[i - 1][words[i - 1].length - 1]) { failIndex = i; break; } else if (words.slice(0, i - 1).includes(words[i])) { failIndex = i; break; } } if (failIndex === -1) { return [0, 0] } else { const failNumber = (failIndex + 1) % n > 0 ? (failIndex + 1) % n : n // 탈락한 사람의 번호 (탈락한 차례를 선수 명수로 나눈 나머지, 0인 경우 맨 끝 번호 선수) return [failNumber , parseInt((failIndex + 1) / n) + (failNumber === n ? 0 : 1)] // 몫: 탈락한 인덱스까지 돈 사이클 횟수, 맨 끝 선수가 아니라면 1을 더해준다. } }
박건우
// 한 글자 X // 중복 글자 X function solution(n, words) { const memory = {}; let round = 1; let number = 1; let prevWord = ''; for(let word of words) { // 끝말잇기 규칙을 지켰는가? if(prevWord && prevWord[prevWord.length - 1] !== word[0]) { return [number, round]; } // 중복단어인가? if(memory[word]) { return [number, round]; } // 한 글자인가? if(word.length === 1) { return [number, round]; } // 단어 저장 memory[word] = true; prevWord = word; number += 1; if(number > n) { round += 1; number = 1; } } // 이상 무 return [0, 0]; }
박주연
function solution(n, words) { const visited = [words[0]]; let answer = [0,0]; for (let i = 1; i < words.length; i++){ // 단어 중복 or 첫글자가 틀렸을 경우 반복문에서 탈출 if(visited.includes(words[i]) || words[i-1].charAt(words[i-1].length - 1) !== words[i].charAt(0)){ answer[0] = (i+1) % n || n ; // 왼쪽 피연산자가 0 즉 false일땐, n 반환 answer[1] = Math.ceil((i+1) / n) break; } visited.push(words[i]); } return answer; }