ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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님 블로그

    '공부 > 프로그래머스' 카테고리의 다른 글

    Lv2)JS - 위장  (0) 2022.02.28
    Lv2)JS- 큰 숫자 만들기  (0) 2022.02.23
    Lv2)JS - N개의 최소공배수  (0) 2022.02.13
    Lv2)JS- 짝지어 제거하기  (0) 2022.02.10
    Lv2)JS - 행렬의 곱셈  (0) 2022.02.10

    댓글

Designed by Tistory.