공부/프로그래머스
Lv2)JS - 영어 끝말잇기
조용한외침
2022. 2. 22. 00:49
코딩테스트 연습 - 영어 끝말잇기
3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3,3] 5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0,0]
programmers.co.kr
느낀점
이번 문제는 하나의 반복문 안에서 문제를 해결 할 수 있을 것이라고 생각했다. 끝말잇기기 때문에 현재값과 이전값을 비교하면서 진행하면 충분히 풀 수 있을 것이라고 생각했으나 역시 기본 테스트 케이스는 통과를 하지만 다른 테스트 케이스에서는 실패를 하는 것을 확인 했다. 내가 푼 방식의 오류가 존재했고 이 방법 보다는 사용한 단어를 push하는 방법이나, 중복여부를 확인하는 방법을 사용하면 쉽게 풀 수 있었다.
다른 분들이 푼 풀이를 참고 했을 때 확실히 쉽게 이해가 갔고 아직은 더 학습이 필요하고 생각할 게 필요하다고 느끼고 있다.
내가 푼 방법 (틀린 방법, 테스트케이스 실패)
function solution(n, words) {
var answer = [];
let time = 0;
for (let i = 0; i < words.length; i++) {
// console.log(words.indexOf(words[i])!==i);
// console.log(words[i-1][words[i-1].length-1]!==words[i][0]);
for (let j = i + 1; j < words.length; j++) {
if (words[i] === words[j]) {
console.log(j);
answer.push(j % n + 1);
answer.push(Math.ceil(j / n));
console.log(words[j]);
}
}
if (i < words.length - 1) {
if (words[i][words[i].length - 1] !== words[i + 1][0]) {
console.log(i + 1)
answer.push((i + 1) % n + 1)
console.log((i + 2) / n)
//time = Math.ceil((i+1)/n);
time = parseInt(i + 1 / n);
console.log(time);
answer.push(time);
}
}
}
return answer.length !== 0 ? answer : [0, 0];
}
다른 방법 1.
function solution(n, words) {
var answer = [0, 0];
// 이미 사용한 단어를 넣을 배열
var usedWords = []
// 1번 플레이어부터 시작
usedWords.push(words[0])
for (let i = 1; i < words.length; i++) {
var beforeWord = words[i-1]
var currentWord = words[i]
// 이전단어의 맨 뒷글자와 현재단어의 맨 앞글자가 같고
// 이전에 사용한적이 없는 단어라면
if (beforeWord[beforeWord.length - 1] === currentWord[0]
&& usedWords.indexOf(currentWord) === -1) {
// 계속 게임을 진행
usedWords.push(currentWord)
} else {
// 그게 아니라면 몇번째 턴인지, 몇번째 플레이어 인지 계산해서 리턴해준다.
var turn = parseInt(i / n) + 1
var player = i % n + 1
return answer = [player, turn]
}
}
return answer;
}
다른 방법 2.
function solution(n, words) {
var fail_i = -1;
for(var i = 1; i < words.length; i++){
var val = words[i];
// 전단계의 끝말과 현단계 첫말이 다를 경우
if(words[i-1].substring(words[i-1].length-1) != val.substring(0, 1)) {
fail_i = i;
break;
}
// indexOf 함수는 첫번째로 값이 맞는 인덱스만 반환하므로
// 현재 인덱스와 맞지 않을 경우 중복된 값
if(words.indexOf(val) != i) {
fail_i = i;
break;
}
}
if(fail_i == -1) return [0,0];
var no = fail_i%n + 1;
var turn = Math.floor(fail_i/n) + 1;
return [no, turn];
}
reference