코딩쌀롱
[프로그래머스_JS] 영어 끝말 잇기 본문
문제
게임을 하는 사람 수 n, 순서대로 말한 단어들을 넣은 배열 words를 매개변수로 받는다.
단어의 첫 글자를 맞게 말했는지, 앞에 이미 나온 단어인지를 확인하고 틀린 사람의 번호와 몇 번째 차례일 때 그 단어를 이야기 했는지를 반환한다.[사람 번호, 차례] 아무도 틀리지 않았다면 [0, 0]을 반환한다.
나의 풀이
data = [ [ 사람1 ], [ 사람2 ], ...[ 사람n ] ]
2차원 배열로 만들어서 words의 단어들을 차례대로 사람들의 배열에 넣어가면서 체크.
1. 사람 수(n)만큼 data에 속배열을 만든다.
2. 속배열에 돌아가면서 단어 넣기
2-1 앞글자를 맞게 했는지 체크 (전 배열의 마지막 글자, 제일 앞 글자 비교)
2-2 이전에 안 나왔던 단어인지 체크 (flat으로 평탄화, indexOf로 존재 여부 확인)
3. 넣은 단어들을 words에서 제거
3-1 사람이 3명일 때 0, 1, 2, 0, 1, ...이렇게 반복해서 넣어야 하기 때문에
words의 인덱스와 data의 인덱스를 맞춰주는 것.
4. 체크에서 걸러지면 과정 종료
4-1 사람 번호는 속배열 인덱스 + 1, 차례는 속배열의 길이와 같다. answer에 push
4-2 반복문 종료 (윗 단계 for문 break)
5. 체크에서 걸러지지 않아서 answer가 빈 배열이면 [0, 0]을 할당한다.
function solution(n, words) {
let answer = [];
let data = [];
for(let i = 0; i < n; i++) { data.push(new Array()); }
const times = Math.ceil(words.length / n);
outer: for(let i = 0; i < times; i++) {
for(let j = 0; j < n; j++) {
if(words[j]) {
data[j].push(words[j]);
const condition = isRepeated(j, data, words[j]) || !isCorrectChar(j, n, data, words[j])
if(condition) {
answer.push(j+1, data[j].length);
break outer;
}
}
}
words.splice(0, n);
}
if(answer.length === 0) answer = [0, 0];
console.log(answer);
return answer;
}
function isCorrectChar(j, n, data, word) {
if(j === 0) j = n;
const idx = data[j-1].length - 1;
if(idx === -1) return true;
const previousChar = data[j-1][idx].substr(-1, 1);
const nowChar = word.substr(0, 1);
return previousChar === nowChar;
}
function isRepeated(j, data, word) {
const copied = data.map(e => [...e]);
copied[j].splice(-1, 1);
const spreadData = copied.flat(1);
return spreadData.indexOf(word) !== -1
}
나만큼 코드 길게 쓴 사람 없을 듯....다른 풀이들을 공부해야겠다...😕
'개발공부' 카테고리의 다른 글
컴퓨터 구조의 발전 과정(릴레이, 진공관, 트랜지스터) (3) | 2021.01.05 |
---|---|
for문 안의 let 변수에 외부에서 접근하기(Block scope) (0) | 2020.12.24 |
push()의 반환값 (0) | 2020.12.21 |
new Array(3).fill([ ]) 문제 (0) | 2020.12.20 |
Comments