[Lv2] 영어 끝말잇기

Creating the dots·2022년 2월 9일
0

Algorithm

목록 보기
63/65
post-custom-banner

프로그래머스

나의 풀이

  • 끝말잇기가 끝나는 경우는 다음과 같다.

    • 앞사람이 말한 단어의 마지막 글자와 다음사람이 말한 단어의 첫번째 글자가 다른 경우
    • 이전에 등장했던 단어를 말한 경우
  • 리턴해야하는 값은 [차례, 라운드]이다.

    • i는 1부터 시작하고, 인원은 최소 2명 이상이다.
    • 차례는 인덱스+1을 n으로 나눈 나머지이다. 0번째 인덱스는 1번 사람이고, 1번째 인덱스는 2번 사람이다. 만약 나머지가 0이라면, n번째 사람이다.
    • 라운드는 인덱스+1한 나머지가 1일때마다 다시 첫번째 사람으로 돌아온다.
function solution(n, words) {
  let round = 1;
  for(let i=1; i<words.length; i++) {
    const prev = words[i-1];
    const now = words[i];
    if((i+1)%n===1) round++;
    if(prev[prev.length-1] !== now[0] || words.indexOf(now) !== i) {
      const turn = (i+1)%n || n;
      return [turn, round];
    }
  }
  return [0,0]
}

다른 분의 풀이

나는 turn과 round라는 변수를 따로 만들어서 사용했는데, 이 풀이에서는 answer라는 변수값을 사용해서 두가지 정보를 만들어낸 점이 너무 신기했다. 그런데, answer에 idx값이 할당되어서 끝말잇기를 끝내는 지점을 찾아냈음에도 계속 reduce가 실행되는 것이 조금 아쉬웠다.

  • answer는 끝말잇기가 끝난 인덱스이다. 이를 활용해서 몇번째 라운드인지, 몇번째 사람이 틀렸는지를 알 수 있다. 끝말잇기가 틀리지 않고 모두 끝났다면 answer=0이다.
  • answer를 n으로 나누고 1을 더해 몇번째 사람이 틀렸는지 구한다.
  • answer+1한 값을 n으로 나눈 값을 올림해 몇번째 라운드인지 구한다.
  • answer=0이라면 [0,0]을 리턴한다.
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.ceil((answer+1)/n)] : [0,0];
}                        

위에서 작성한 풀이에서 reduce를 중단하는 코드를 추가해 작성해보았다. reduce에서는 break를 쓸 수 없고, return 시키면 첫번째 인자에 값이 undefined가 담기므로 사용할 수 없다. 따라서, (옵션)인자로 입력받는 네번째 array를 mutate시키는 점을 활용해야한다.

이때 splice를 사용해 현재 인덱스부터 모든 요소를 제거시켜 reduce를 종료시킬 수 있다.

function solution(n, words) {
    let answer = 0;
    words.reduce((prev, now, idx, arr) => {
        answer = answer || ((words.slice(0, idx).indexOf(now) !== -1 || prev !== now[0]) ? idx : answer);
        if(answer) arr.splice(idx); //추가한 부분
        return now[now.length-1];
    }, "")

    return answer ? [answer%n+1, Math.ceil((answer+1)/n)] : [0,0];
}
profile
어제보다 나은 오늘을 만드는 중
post-custom-banner

0개의 댓글