✅ 문제
1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.
- 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
- 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
- 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
- 이전에 등장했던 단어는 사용할 수 없습니다.
- 한 글자인 단어는 인정되지 않습니다.
다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.
tank → kick → know → wheel → land → dream → mother → robot → tank
위 끝말잇기는 다음과 같이 진행됩니다.
- 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.
- 2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.
- 3번 사람이 자신의 첫 번째 차례에 know를 말합니다.
- 1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.
- (계속 진행)
끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.
사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.
✅ 풀이
구현 문제로 정의하고 반복문을 통해서 풀이하였다. 역시나 더 나은 코드가 있을 것이라고 생각한다.
정답 풀이는 아래와 같다. 주석을 참고해서 보면 될 것 같다.
function solution(n, words) {
// 현재 턴
let turn = 1;
// 이전에 나온 단어
let preWords = [];
for (let i = 0; i < words.length; i ++) {
const nowWord = words[i];
const nowPerson = (i + 1) % n === 0 ? n : (i + 1) % n;
if (nowWord.length === 1) {
// 한글자 단어 탈락
return [nowPerson, turn];
}
if (i > 0) {
const preword = preWords.at(-1);
if (preWords.includes(nowWord)) {
// 이전에 등장했던 단어라면 탈락
return [nowPerson, turn];
}
if (i > 0 && preword[preword.length - 1] !== nowWord[0]) {
// 끝말잇기가 아니면 탈락
return [nowPerson, turn];
}
}
// 통과 시 단어 추가
preWords.push(nowWord);
// 현재 사람이 마지막 사람이면 turn ++;
if (nowPerson === n) {
turn += 1;
}
}
// 탈락자 없다면?
return [0, 0];
}
solution(2, ["hello", "one", "even", "never", "now", "world", "draw"]);
'Development > 자료구조 & 알고리즘' 카테고리의 다른 글
[알고리즘] 프로그래머스 - 미로탈출 (JS) (0) | 2023.09.18 |
---|---|
[알고리즘] 프로그래머스 - 시소짝궁(JS) (0) | 2023.09.18 |
[알고리즘] 프로그래머스 - 예상 대진표 (JS) (0) | 2023.09.10 |
[알고리즘] 프로그래머스 - 달리기 경주 (JS) (1) | 2023.09.08 |
[알고리즘] 프로그래머스 - 롤케이크 자르기 (JS) (0) | 2023.09.08 |
댓글