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
이다.
preWord
와 postWord
가 다르다면, 탈락자가 발생한다.
혹은, 스택에 들어가 있는 단어가 현재 단어로 등장하는 경우에도 탈락자가 발생한다.
이제 어떤 번호의 참가자가 탈락했는지, 몇 번째 게임에서 탈락했는지를 알아봐야한다.
참가자의 번호 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
를 활용하여 중복되는 단어가 있는지 체크하셨다.