https://school.programmers.co.kr/learn/courses/30/lessons/12981
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return - 주어진 자료는 무엇인가?
- 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
- 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
- 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
- 이전에 등장했던 단어는 사용할 수 없습니다.
- 한 글자인 단어는 인정되지 않습니다.
- 조건은 무엇인가?
- 끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.
- words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.
- 단어의 길이는 2 이상 50 이하입니다.
- 모든 단어는 알파벳 소문자로만 이루어져 있습니다.
- 끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.
- 정답은 [ 번호, 차례 ] 형태로 return 해주세요.
- 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.
2. 계획
- words를 순회하면서 중복이 있는지 확인한다.
1-1. 중복이 있다면 반복을 멈추고 중복인 위치를 찾아서 탈락인 사람의 번호와 그 사람이 몇번째에 탈락인지 리턴한다. - words를 순회하면서 끝말잇기가 안되는 경우나 단어의 길이가 1인 경우
2-1. 반복을 멈추고 멈춘 위치를 찾아서 탈락인 사람의 번호와 그 사람이 몇번째에 탈락인지 리턴한다. - 탈락자가 없는 경우 [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. 반성
- 중복되는 코드가 많은데 중복을 제거하면 일부 테스트 통과가 안되었다. 중복을 제거할 수 있는 다른 방법을 고민해봐야겠다.
'코테연습' 카테고리의 다른 글
137. 이것이 코딩 테스트다 : 12장 문자열 재정렬 Javascript (0) | 2022.09.15 |
---|---|
136. 이것이 코딩 테스트다 : 12장 럭키 스트레이트 Javascript (0) | 2022.09.15 |
134. 다음 큰 숫자 Javascript (0) | 2022.09.14 |
133. 이것이 코딩 테스트다 : 11장 문자열 뒤집기 Javascript (0) | 2022.09.14 |
132. 이것이 코딩 테스트다 : 11장 곱하기 혹은 더하기 Javascript (0) | 2022.09.14 |
댓글