1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.
1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
이전에 등장했던 단어는 사용할 수 없습니다.
한 글자인 단어는 인정되지 않습니다.
다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.
tank → kick → know → wheel → land → dream → mother → robot → tank
위 끝말잇기는 다음과 같이 진행됩니다.
1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.
2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.
3번 사람이 자신의 첫 번째 차례에 know를 말합니다.
1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.
(계속 진행)
끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.
사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.
일단 문제가 너무 길어서 보고 놀랬다.. 허거걱
그리고 어떻게 풀어야 할 지 감이 잘 안왔던 것 같다.
이렇게 생각하면 저게 문제고 저렇게 생각하면 이게 문제였다. 그래도 차근히.. 내가 풀 수 있는 선에서 문제를 풀어본다.
용기만 가득해서 for문으로 어떻게 해보겠다고 만들어 낸 코드이다.
보기가 너무 안좋고 더 나은 방법이 있을 거 같은데.. 라고 생각하게 만든다. 이거 짜는데도 시간이 오래 걸렸다. 분발해야지..
내가 짠 코드
function solution(n, words) {
// n은 사람 수
// words : 단어 개수
//정답을 담기 위한 배열
var answer = [0, 0];
//마지막 글자가 담길 곳. 첫 단어의 마지막 글자를 넣어놓으면 처음부터 에러가 발생하기 때문에 처음에 첫 단어의 첫 글자를 넣어두고, 첫 단어의 첫 글자와 비교하게 된다.
var lastWord = words[0].slice(0,1);
//중복된 단어 반별을 위한 배열
var same = [];
//끝까지 돌기 위한 for문
for(let i=0; i < words.length; i++){
// 중복된 단어가 있는지 알아보기
for(let j=0; j < same.length; j++){
//same 배열에 들어있는 단어 중 하나라도 같은 단어가 나온다면
if(same[j] === words[i]){
answer = [ (i % n)+1, Math.floor(i/n)+1]
return answer;
}
}
//지금 단어 첫 글자가 이전 단어의 마지막 글자와 같지 않다면
if(words[i].slice(0, 1) !== lastWord){
answer = [ i % n + 1, Math.floor(i/n)+1]
return answer;
}
//이전 단어 마지막 글자로 저장되어 있는 lastWord를 지금 단어의 마지막 글자로 바꿔주기
lastWord = words[i].slice(-1);
//지금 단어를 same 배열에 넣기
same.push(words[i]);
}
return answer;
}
이게 최선일까 싶어 다른 사람이 짠 코드를 보니까.. 메소드를 정말 잘 이용하셨다.. 나도 이렇게 이용할 수 있는 사람이 되어야겠다고 생각했다. 그렇기 위해선 아직 공부가 많이 필요한 거 같다. 아자아자!
다른 사람이 짠 코드
let lastWord = words[0].slice(0,1);
let answer = [0, 0]
var same = []
words.every((word, idx) => {
if(same.includes(word)){
answer = [ idx % n + 1, Math.floor(idx / n) + 1]
return false
}
if(word[0].slice(0, 1) !== lastWord){
answer = [ idx % n + 1, Math.floor(idx / n) + 1]
return false
}
lastWord = word.slice(-1);
same.push(word)
return true;
})
return answer;
}