패배조건
1. 끝글자 !== 첫글자
2. 앞에서 단어를 이미 사용했을 때
return 해야 하는것
누가 실패했는지, 몇번째 턴에서 실패했는지
나는 최대한 조건에 맞춰서 💩같은 코드를 작성했고 효율성 테스트도 💩이 나왔다 !
function solution(n, words) {
var previousWords = [];
const answer = [];
let turn = 1;
let flag = 1;
for (let i = 0; i < words.length; i++) {
let lastWord;
let lastLetter;
let firstLetter;
if (previousWords.length > 0) {
lastWord = previousWords[previousWords.length - 1];
lastLetter = lastWord[lastWord.length - 1];
firstLetter = words[i][0];
}
if (
previousWords.indexOf(words[i]) > -1 ||
(lastLetter && lastLetter !== firstLetter)
) {
const currentPerson = (i + 1) % n === 0 ? n : (i + 1) % n;
answer.push(currentPerson);
answer.push(turn);
flag = 0;
break;
}
if ((i + 1) % n === 0) turn++;
previousWords.push(words[i]);
}
return flag ? [0, 0] : answer;
}
- 중복을 확인하기 위해 for문 바깥에 배열을 만들어 주었다
- previousWords 라는 배열에 값이 있을 때만 마지막 글자를 변경해 주었고
- 1) 중복이 있을 때 2) 이전단어의 마지막 글자와 새단어의 첫번째 글자가 다를 때 for문을 종료하도록 만들었다
- turn도 따로 변수로 선언해 줬는데 1로 설정해 주고 한번 돌때마다 증가 시켜줘야 하니 index를 사람수로 나눴을때 0이 되면 === 끝사람이 되면 turn 을 증가시켜주었다
- 탈락자가 나와 종료될 때 현재사람은 1,2,3,4 이런식으로 index와 1차이가 나서
const currentPerson = (i + 1) % n === 0 ? n : (i + 1) % n; 이렇게 작성해 주었다- flag도 사용해 주었는데 탈락자가 나올경우 0으로 만들어줘서 최종적으로 return 할 때 flag가 존재하면 === 탈락자가 없다는 소리 [0,0] return해 주었다
나머지 사용을 시도한 나를 칭찬해 주고싶다.
이제 다른사람이 작성한 코드를 살펴보았다
reduce를 활용하셨는데 reduce는 단지 sum을 구하는 내장함수가 아니라는 글을 봤는데 이번에 확실하게 느꼈다
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];
}
- reduce에 초기값을 세팅해주면 prev에 대입 되고
- return 값은 다음 prev에 할당된다
- 만약 초기값을 세팅해 주지않으면 0번째 index가 now, 1번째 index가 cur이 된다 그래서 웬만하면 초기값을 셋팅해 주는 것이 좋다
- ⁉️ 여기서 의문점이 든것이 그럼 제일 처음것은 pre가 ""이고 now[0]과 필연적으로 다를텐데?????? 라는 생각이 들었는데
- 그때는 answer에 현재 index인 0이 할당되어서 상관없었다..
- 대신 초기값을 ""로 설정해 주지않으면 0번째 index 단어 전체!!와 1번째 index 단어의 첫글자와 비교해 줘서 오류가 뜨니 초기값을 설정해 줘야한다