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

2023. 1. 31. 16:32기록/Programmers

    목차

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12981

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


나의 문제 풀이

function solution(n, words) {
  let answer = [0, 0];

  for (let i = 1; i < words.length; i++) {
    if (
      words[i - 1][words[i - 1].length - 1] !== words[i][0] ||
      words.slice(0, i).includes(words[i])
    ) {
      answer = [(i % n) + 1, Math.ceil((i + 1) / n)];
      break;
    }
  }

  return answer;
}
  • 정답 배열에 미리 [0, 0]을 할당해 놓음
  • 1부터 words 배열의 길이보다 작을 때까지 반복함
    • words 배열에서의 이전 요소의 마지막 글자가 현재 요소의 첫번째 글자와 동일하지 않거나 (이어지지 않는 단어)
    • words 배열의 이전 요소들 중에서 현재 요소가 포함되어 있을 경우 (중복 단어)
    • 정답 변수에 [번호, 차례] 를 할당하고 빠져나감 
      • 번호: (i % n) + 1
      • 차례: Math.ceil((i + 1) / n) 
        • 예) 단어 배열 : ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"]
        • 사람 수: 3명
        • 걸린 사람: "tank" 를 중복으로 말한 사람
        • 걸린 사람의 번호: (8 % 3) + 1 === 3번째 사람
        • 걸린 사람의 차례: 올림((8 + 1) / 3) === (9 / 3) === 3
        • 정답: [3, 3]

다른 사람의 문제 풀이

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