코딩테스트

*[JS] Summer/Winter Coding(~2018) > 영어 끝말잇기

차차한 2022. 9. 14. 13:15

이번 문제는 너무 안 풀려서 결국 다른 사람 코드를 참고했다.

막상 답안을 보면 어려운 메소드 사용한 것도 없고 내가 생각했던 알고리즘과 유사한데 왜 그렇게 안 풀렸을까...답답 ㅠㅠ

다음에 꼭 다시 풀기!!!!!

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];
}

변수 val에 words 배열에서 i번째 값을 담았다.

 

전 단어의 마지막 글자와 다음 단어의 첫 글자가 같은 경우, 해당 i번째를 변수에 저장해주고 반복을 멈춘다.

 

중복된 단어가 있는 경우에는 indexOf로 값을 체크하는데 만약 indexOf로 찾은 인덱스 값과 i가 다르다면 중복단어가 있는 것이기 때문에 i를 저장하고 반복을 멈춘다

 -> 만약에 tank → kick → know → wheel → land → dream → mother → robot → tank 에서 i가 8이고 val가 tank일 때 words.indexOf("tank")를 찾게 되면 가장 처음에 나오는 단어의 인덱스를 반환한다. 0을 반환하면 i와 값이 다르기 때문에 중복된 것이 있는지 확인할 수 있다.

 

위의 조건 체크를 모두 했는데도 i가 여전히 -1이라면 조건을 모두 통과한 것이라 [0,0]을 바로 리턴해준다.

몇 번째 사람인지는 i % n +1로 확인할 수 있는데, 첫 번째 케이스에서 i(조건만족을 못 한 단어)가 8이고 n이 3이면 나머지가 2가 나오고 +1을 해서 3번 사람을 확인할 수 있다.

몇 번째 턴인지는 i / n을 내림 후 1을 더해주면 된다. 8 / 3을 하면 2.6666..이 나와서 2로 만들어 준 후 +1을 하면 3번째 턴에서 실수가 일어난지를 알 수가 있다.