-
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
'공부 > 프로그래머스' 카테고리의 다른 글
Lv2)JS - 위장 (0) 2022.02.28 Lv2)JS- 큰 숫자 만들기 (0) 2022.02.23 Lv2)JS - N개의 최소공배수 (0) 2022.02.13 Lv2)JS- 짝지어 제거하기 (0) 2022.02.10 Lv2)JS - 행렬의 곱셈 (0) 2022.02.10