코딩쌀롱

[프로그래머스_JS] 영어 끝말 잇기 본문

개발공부

[프로그래머스_JS] 영어 끝말 잇기

이브✱ 2020. 12. 22. 17:19

 

문제

프로그래머스 12981 영어 끝말잇기 문제

게임을 하는 사람 수 n, 순서대로 말한 단어들을 넣은 배열 words를 매개변수로 받는다.

단어의 첫 글자를 맞게 말했는지, 앞에 이미 나온 단어인지를 확인하고 틀린 사람의 번호와 몇 번째 차례일 때 그 단어를 이야기 했는지를 반환한다.[사람 번호, 차례] 아무도 틀리지 않았다면 [0, 0]을 반환한다.

 

나의 풀이

data = [ [ 사람1 ], [ 사람2 ], ...[ 사람n ] ]
2차원 배열로 만들어서 words의 단어들을 차례대로 사람들의 배열에 넣어가면서 체크.

1. 사람 수(n)만큼 data에 속배열을 만든다.

2. 속배열에 돌아가면서 단어 넣기

     2-1 앞글자를 맞게 했는지 체크 (전 배열의 마지막 글자, 제일 앞 글자 비교)

     2-2 이전에 안 나왔던 단어인지 체크 (flat으로 평탄화, indexOf로 존재 여부 확인)

3. 넣은 단어들을 words에서 제거

     3-1 사람이 3명일 때 0, 1, 2, 0, 1, ...이렇게 반복해서 넣어야 하기 때문에

         words의 인덱스와 data의 인덱스를 맞춰주는 것.

4. 체크에서 걸러지면 과정 종료

     4-1 사람 번호는 속배열 인덱스 + 1, 차례는 속배열의 길이와 같다. answer에 push

     4-2 반복문 종료 (윗 단계 for문 break)

5. 체크에서 걸러지지 않아서 answer가 빈 배열이면 [0, 0]을 할당한다.

 

function solution(n, words) {
    let answer = [];
    let data = [];
    for(let i = 0; i < n; i++) { data.push(new Array()); }

    const times = Math.ceil(words.length / n);
    outer: for(let i = 0; i < times; i++) {
        for(let j = 0; j < n; j++) {
            if(words[j]) {
                data[j].push(words[j]);
                const condition = isRepeated(j, data, words[j]) || !isCorrectChar(j, n, data, words[j])
                if(condition) {
                    answer.push(j+1, data[j].length);
                    break outer;
                }
            }
        }
        words.splice(0, n);
    }
    if(answer.length === 0) answer = [0, 0];
    console.log(answer);
    return answer;
}

function isCorrectChar(j, n, data, word) {
    if(j === 0) j = n;
    const idx = data[j-1].length - 1;
    if(idx === -1) return true;
    const previousChar = data[j-1][idx].substr(-1, 1);
    const nowChar = word.substr(0, 1);
    return previousChar === nowChar;
}

function isRepeated(j, data, word) {
    const copied = data.map(e => [...e]);
    copied[j].splice(-1, 1);
    const spreadData = copied.flat(1);
    return spreadData.indexOf(word) !== -1
}

 

나만큼 코드 길게 쓴 사람 없을 듯....다른 풀이들을 공부해야겠다...😕

Comments