230428_Algorithm

majungha·2023년 4월 28일
1

알고리즘

목록 보기
37/71

오늘의 알고리즘 👍

📝 1. 영어 끝말잇기


  • 1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.
  • 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
  • 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
  • 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
  • 이전에 등장했던 단어는 사용할 수 없습니다.
  • 한 글자인 단어는 인정되지 않습니다.

▷ 입출력 예

solution(3, ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"]) // [3,3]
solution(5,["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"]) // [0,0]
solution(2, ["hello", "one", "even", "never", "now", "world", "draw"]) // [1,3]

▷ 해결 못함 ❌

▷ 수업 풀이

function solution(n, words) {
  for (let i = 1; i < words.length; i++) {
    let player = (i % n) + 1; // 어떤 사람이 탈락했는지
    let turn = Math.floor(i / n) + 1; // 몇번째 차례에서 탈락했는지

    // 이전 사람이 말한 단어의 맨 마지막 알파벳을 가져온다.
    let lastLetter = words[i - 1][words[i - 1].length - 1];
    // 현재 사람이 말한 단어의 가장 앞에 있는 알파벳을 가져온다.
    let firstLetter = words[i][0];

    // 앞 사람이 말한 단어의 뒤 알파벳과 현재 게임의 사람이 말한 단어의 앞 부분이 일치하지 않는다면
    // 내가 말한 단어의 인덱스 값이 최초로 그 단어의 위치에 있는 인덱스 값과 동일하지 않을 때
    if (lastLetter !== firstLetter || words.indexOf(words[i]) !== i) {
      return [player, turn];
    }
  }
  return [0, 0];
}

▷ reduce 매서드 사용 풀이

function solution(n, words) {
  let stop = false; // 최초 탈락자가 생긴 경우, 게임을 진행하지 않게 하는 스위치 변수
  return words.slice(1).reduce(
    (acc, cur, i) => {
      let lastLetter = words[i].at(-1); // [ words[i].length - 1 ];
      let firstLetter = cur[0];

      const player = (++i % n) + 1;
      const turn = Math.trunc(i / n) + 1;

      // 최초 탈락자가 생긴 시점
      if (!stop) {
        if (lastLetter !== firstLetter || words.indexOf(cur) !== i) {
          stop = true;
          return [player, turn];
        }
      }

      return acc;
    },
    [0, 0],
  );
}

▷ some 매서드 사용 풀이

function solution(n, words) {
  let player = 1;
  let turn = 1;

  const result = words.slice(1).some((cur, i) => {
    let lastLetter = words[i].at(-1); // [ words[i].length - 1 ];
    let firstLetter = cur[0];

    player = (++i % n) + 1;
    turn = Math.trunc(i / n) + 1;

    return lastLetter !== firstLetter || words.indexOf(cur) !== i;
  });
  return !result ? [0, 0] : [player, turn];
}

출처: 프로그래머스
출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글