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

박기영·2023년 1월 12일
0

프로그래머스

목록 보기
120/159

solution

function solution(n, words) {
    let ans = [0, 0];
    let stack = [];
    
    for(let i = 0; i < words.length; i++){
        if(stack.length === 0){
            stack.push(words[i]);
            continue;
        }
        
        const pre = stack[stack.length - 1];
        const preWord = pre[pre.length - 1];
        
        const post = words[i];
        const postWord = post[0];
        
        if(preWord !== postWord || stack.includes(post)){
            const who = (i % n) + 1;
            const count = Math.ceil((i + 1) / n);
            
            ans[0] = who;
            ans[1] = count;
            break;
        }
        
        stack.push(words[i]);
    }
    
    return ans;
}

우선 기본적으로 아무 일도 없을 때 반환될 초기값 [0,0]ans에 할당한다.
스택에 단어들을 넣으면서 탈락자를 확인할 것이다.

스택에 들어간 단어의 가장 위에 있는 단어와 현재 단어를 비교하는 것이 핵심이다.
스택에 들어간 단어의 가장 위에 있는 단어가 pre이고,
pre 단어의 가장 끝 글자가 preWord이다.

현재 단어는 post이고,
post 단어의 가장 앞 글자가 postWord이다.

preWordpostWord가 다르다면, 탈락자가 발생한다.
혹은, 스택에 들어가 있는 단어가 현재 단어로 등장하는 경우에도 탈락자가 발생한다.

이제 어떤 번호의 참가자가 탈락했는지, 몇 번째 게임에서 탈락했는지를 알아봐야한다.

참가자의 번호 who는 다음 예시를 보자.
5명의 참가자가 있고 3번 참가자가 2 번째 게임에서 탈락하는 상황이다.

1,2,3,4,5 참가자

[1번(0), 2번(1), 3번(2), 4번(3), 5번(4), 1번(5), 2번(6), 3번(7)]
==> [참가자 번호(인덱스), ...] 의 형태

who를 구하기 위해서는 (인덱스 % 참가 인원) + 1을 하면 된다.
위 예시의 경우, (7 % 5) + 1이 되어, 3번이 나오게 된다.

count를 구하기 위해서는 Math.ceil((인덱스 + 1) / 참가 인원)을 하면 된다.
위 예시의 경우, Math.ceil((7 + 1) / 5)가 되어, 2번째 게임이 된다.

이를 ans에 각각 저장해주고, 반환하면 된다.
만약, 아무 일도 없다면 ans에는 아무 변화도 없고, 초기값이 출력된다.

다른 분 풀이

function solution(n, words) {
    let answer = 0;
    words.reduce((prev, now, idx) => {
        answer = answer || ((words.slice(0, idx).indexOf(now) !== -1 || prev !== now[0]) ? idx : answer);
        return now[now.length-1];
    }, "")

    return answer ? [answer%n+1, Math.floor(answer/n)+1] : [0,0];
}

다른 분의 풀이를 가져와봤다.
스택을 사용한 나와달리, 아무런 저장 장소 없이 진행하셨다.

words.slice(0, idx).indexOf(now) !== -1를 활용하여 중복되는 단어가 있는지 체크하셨다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글