공부/프로그래머스

Lv2)JS - 영어 끝말잇기

조용한외침 2022. 2. 22. 00:49

문제링크

 

코딩테스트 연습 - 영어 끝말잇기

3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3,3] 5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0,0]

programmers.co.kr

느낀점

이번 문제는 하나의 반복문 안에서 문제를 해결 할 수 있을 것이라고 생각했다. 끝말잇기기 때문에 현재값과 이전값을 비교하면서 진행하면 충분히 풀 수 있을 것이라고 생각했으나 역시 기본 테스트 케이스는 통과를 하지만 다른 테스트 케이스에서는 실패를 하는 것을 확인 했다. 내가 푼 방식의 오류가 존재했고 이 방법 보다는 사용한 단어를 push하는 방법이나, 중복여부를 확인하는 방법을 사용하면 쉽게 풀 수 있었다.

 

다른 분들이 푼 풀이를 참고 했을 때 확실히 쉽게 이해가 갔고 아직은 더 학습이 필요하고 생각할 게 필요하다고 느끼고 있다.

 

내가 푼 방법 (틀린 방법, 테스트케이스 실패)

function solution(n, words) {
    var answer = [];
    let time = 0;
    for (let i = 0; i < words.length; i++) {
        // console.log(words.indexOf(words[i])!==i);
        // console.log(words[i-1][words[i-1].length-1]!==words[i][0]);
        for (let j = i + 1; j < words.length; j++) {
            if (words[i] === words[j]) {
                console.log(j);
                answer.push(j % n + 1);
                answer.push(Math.ceil(j / n));
                console.log(words[j]);
            }
        }
        if (i < words.length - 1) {
            if (words[i][words[i].length - 1] !== words[i + 1][0]) {
                console.log(i + 1)
                answer.push((i + 1) % n + 1)
                console.log((i + 2) / n)
                //time = Math.ceil((i+1)/n);
                time = parseInt(i + 1 / n);
                console.log(time);
                answer.push(time);

            }
        }
    }
    return answer.length !== 0 ? answer : [0, 0];
}

다른 방법 1.

function solution(n, words) {
    var answer = [0, 0];
    // 이미 사용한 단어를 넣을 배열
    var usedWords = []
    // 1번 플레이어부터 시작
    usedWords.push(words[0])
    for (let i = 1; i < words.length; i++) {
        var beforeWord = words[i-1]
        var currentWord = words[i]
        // 이전단어의 맨 뒷글자와 현재단어의 맨 앞글자가 같고
        // 이전에 사용한적이 없는 단어라면
        if (beforeWord[beforeWord.length - 1] === currentWord[0]
            && usedWords.indexOf(currentWord) === -1) {
            // 계속 게임을 진행
            usedWords.push(currentWord)
        } else {
            // 그게 아니라면 몇번째 턴인지, 몇번째 플레이어 인지 계산해서 리턴해준다.
            var turn = parseInt(i / n) + 1
            var player = i % n + 1
            return answer = [player, turn]
        }
    }
    return answer;
}

다른 방법 2.

function solution(n, words) {

    var fail_i = -1;
    for(var i = 1; i < words.length; i++){
        var val = words[i];
        // 전단계의 끝말과 현단계 첫말이 다를 경우
        if(words[i-1].substring(words[i-1].length-1) != val.substring(0, 1)) {
            fail_i = i;
            break;
        } 
        // indexOf 함수는 첫번째로 값이 맞는 인덱스만 반환하므로
        // 현재 인덱스와 맞지 않을 경우 중복된 값
        if(words.indexOf(val) != i) {
            fail_i = i;
            break;
        }
    }

    if(fail_i == -1) return [0,0];

    var no = fail_i%n + 1;
    var turn = Math.floor(fail_i/n) + 1; 

    return [no, turn];
}

 

reference

deo2kim님 블로그