<STUDY>
📢 문제 📢
1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.
- 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
- 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
- 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
- 이전에 등장했던 단어는 사용할 수 없습니다.
- 한 글자인 단어는 인정되지 않습니다.
사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때,
가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.
제한 사항
- 끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.
- words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.
- 단어의 길이는 2 이상 50 이하입니다.
- 모든 단어는 알파벳 소문자로만 이루어져 있습니다.
- 끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.
- 정답은 [ 번호, 차례 ] 형태로 return 해주세요.
- 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.
❗ 아이디어
- 앞에서 이야기한 단어들을 배열에 넣어두고 중복이 있는지 찾는다.
<전체 코드>
function solution(n, words) {
let answer = [];
let arr = [];
arr.push(words[0]);
for (let i = 1; i < words.length; i++) {
const word = words[i];
const str = arr[arr.length - 1];
if (arr.includes(word) || str[str.length - 1] !== word[0]) return [i % n + 1, parseInt(i / n) + 1];
arr.push(word);
}
return [0, 0];
}
<코드 설명>
for (let i = 1; i < words.length; i++) {
const word = words[i];
const str = arr[arr.length - 1];
if (arr.includes(word) || str[str.length - 1] !== word[0]) return [i % n + 1, parseInt(i / n) + 1];
arr.push(word);
}
- word : 현재 단어
- str : 이전 단어
- 현재 단어가 중복이거나 현재 단어의 첫 문자와 이전 단어의 끝 문자가 다른 경우 번호와 차례를 출력한다.
다른 분들의 풀이를 보던 중 reduce()를 이용한 풀이를 보았다.
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];
}
더 공부해야겠다..
🔆프로그래머스 Lv2. 영어 끝말잇기🔆
'STUDY > Algorithm' 카테고리의 다른 글
[프로그래머스_자바스크립트] Lv.2 행렬의 곱셈 (0) | 2023.01.16 |
---|---|
[프로그래머스_자바스크립트] Lv.2 n^2 배열 자르기 (0) | 2023.01.14 |
[프로그래머스_자바스크립트] Lv.2 괄호 회전하기 / 스택, replace() (0) | 2023.01.11 |
[프로그래머스_자바스크립트] Lv.2 [1차] 뉴스 클러스터링 (0) | 2023.01.09 |
[프로그래머스_자바스크립트] Lv.2 K진수에서 소수 개수 구하기 (0) | 2023.01.08 |