본문 바로가기
코테연습

135. 영어 끝말잇기 Javascript

by hxunz 2022. 9. 15.

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

 

프로그래머스

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

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return
  • 주어진 자료는 무엇인가?
    1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
    2. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
    3. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
    4. 이전에 등장했던 단어는 사용할 수 없습니다.
    5. 한 글자인 단어는 인정되지 않습니다.
  • 조건은 무엇인가?
     -
    끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.
     - words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.
     - 단어의 길이는 2 이상 50 이하입니다.
     - 모든 단어는 알파벳 소문자로만 이루어져 있습니다.
     - 끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.
     - 정답은 [ 번호, 차례 ] 형태로 return 해주세요.
     - 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.

2. 계획

  1. words를 순회하면서 중복이 있는지 확인한다. 
    1-1. 중복이 있다면 반복을 멈추고 중복인 위치를 찾아서 탈락인 사람의 번호와 그 사람이 몇번째에 탈락인지 리턴한다. 
  2. words를 순회하면서 끝말잇기가 안되는 경우나 단어의 길이가 1인 경우 
    2-1. 반복을 멈추고 멈춘 위치를 찾아서 탈락인 사람의 번호와 그 사람이 몇번째에 탈락인지 리턴한다. 
  3. 탈락자가 없는 경우 [0,0]을 리턴한다. 
 
 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (n, words) => {
  let fail = 0;
  for (i = 1; i < words.length; i++) {
    if (words.indexOf(words[i]) !== i) {
      fail = i + 1;
      break;
    }
    if (words[i - 1][words[i - 1].length - 1] !== words[i][0] || words[i].length === 1) {
      fail = i + 1;
      break;
    }
  }

  if (fail !== 0) {
    if (fail % n === 0) {
      return [n, Math.ceil(fail / n)]
    } else {
      return [fail % n, Math.ceil(fail / n)]
    }
  } else {
    return [0, 0]
  }
}

test('findNextNumber', () => {
  expect(solution(3, ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"])).toEqual([3, 3]);
  expect(solution(5, ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"])).toEqual([0, 0]);
  expect(solution(2, ["hello", "one", "even", "never", "now", "world", "draw"])).toEqual([1, 3]);
  expect(solution(5, ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "e", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"])).toEqual([3, 2]);
  expect(solution(2, ['qwe', 'eqwe', 'eqwe'])).toEqual([1, 2]);
  expect(solution(2, ['land', 'dream', 'mom', 'mom', 'ror'])).toEqual([2, 2]);
});

4. 반성

  • 중복되는 코드가 많은데 중복을 제거하면 일부 테스트 통과가 안되었다. 중복을 제거할 수 있는 다른 방법을 고민해봐야겠다. 

 

댓글