본문 바로가기
Development/자료구조 & 알고리즘

[알고리즘] 프로그래머스 - 영어 끝말잇기 (JS)

by heondeam 2023. 9. 10.

✅ 문제

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.

  1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
  2. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
  3. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
  4. 이전에 등장했던 단어는 사용할 수 없습니다.
  5. 한 글자인 단어는 인정되지 않습니다.

다음은 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"]);

댓글