프로그래머스 [영어 끝말잇기] - 구현 Lv.2

JH.P·2022년 7월 27일

구현

  • 문제의 요구사항에 맞춰 조건을 잘 분기하여 구현하는 문제이다.

풀이 전 로직

  • 먼저 첫 words 배열의 첫 요소를 duplicate 배열에 저장하고, 첫 요소의 마지막 글자를 last 변수에 할당한다.
    • 중복된 단어인지 검사하고, 끝말잇기의 규칙을 준수하는지 검사하기 위한 과정이다.
  • 주어진 words 배열을 그 다음 차례부터 순회한다.
  • 순회되는 요소인 문자열이 duplicate 배열에 이미 존재하는지 검사한다. 그리고 해당 문자열의 첫 글자가 last 변수의 값과 같은지도 검사한다.
    • 중복된 단어인지 검사하고, 첫 글자가 전에 나왔던 마지막 글자와 일치하는지 검사하는 과정이다.
  • 만약 조건에 일치한다면, 해당 단어를 duplicate 배열에 삽입하고, 해당 단어의 마지막 글자를 last 변수에 재할당한다.
  • 조건에 일치하지 않는다면, 해당 차례의 탈락자의 번호와 몇 번째 차례인지를 반환해야한다.
    • 끝말잇기는 1부터 n까지 순서대로 증가하다가 다시 돌아와 1부터 n까지 순서대로 증가한다.(해당 과정 반복)

    • 탈락이 발생한 위치(인덱스 + 1)이 n의 배수이냐, 아니냐로 조건이 나뉘게 된다.

      • n의 배수인 경우, 끝말잇기는 1부터 n까지 증가하는 것을 계속 반복하므로, n번 번호를 가진 사람이 된다.
      • 그리고 몇 번째 차례인지는, 탈락 위치(인덱스 + 1)을 n으로 나눈 몫과 같다.
      • n의 배수가 아닌 경우, 탈락 위치(인덱스 + 1)을 n으로 나눈 나머지와 같다.
        ex) 탈락 위치가 5번째이고 n이 3까지 있다면, 탈락자 번호는 2번 사람이다.
      • 몇 번째 차례인지는, 탈락 위치를 n으로 나눈 몫에 1들 더한 값이다.
        ex) 탈락 위치가 8번째이고 n이 3까지 있다면, 탈락자 번호 2번 사람은 3번째에 탈락하게 된 것이다.

코드

function solution(n, words) {
    // words를 차례대로 순회
    // words[i]의 끝 글자를 매 순회 때마다 저장 => 끝말잇기 룰을 지키는지 확인하기 위해
    // 한번 순회 때마다 말한 단어 또한 저장 => 중복 검사를 위해
    // 위 두 가지 중 한 가지에 위반되면 탈락
    // 탈락자는 해당 (인덱스 + 1)를 n으로 나눈 나머지 번째 사람임
    // 그럼 탈락 텀은 (인덱스 + 1)를 n으로 나눈 몫 + 1
    
    let last = words[0][words[0].length - 1]
    const duplicate = [words[0]]
    
    for(let i = 1; i < words.length; i++) {
        if(!duplicate.includes(words[i]) && words[i][0] === last) {
            duplicate.push(words[i])
            last = words[i][words[i].length - 1]
        } else {
            if((i + 1) % n === 0) {
                const person = n
                const term = Math.floor((i + 1) / n) 
                return [person, term]
            } else {
                const person = (i + 1) % n      
                const term = Math.floor((i + 1) / n) + 1
                return [person, term]
            }

        }
    }
    return [0, 0]
}
profile
꾸준한 기록

0개의 댓글