배열의 인덱스를 한없이 순회하는 방법
문제 : 프로그래머스 레벨 1 - 모의고사
나의 풀이
function solution(answers) {
var answer = [];
const cand1 = [1, 2, 3, 4, 5]
const cand2 = [2, 1, 2, 3, 2, 4, 2, 5]
const cand3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
let candi1 = []
let candi2 = []
let candi3 = []
let count = [0, 0, 0]
while (candi1.length < 10000) {
candi1 = [...candi1, ...cand1]
candi2 = [...candi2, ...cand2]
candi3 = [...candi3, ...cand3]
}
for (const i in answers) {
if (candi1[i] === answers[i]) count[0]++
if (candi2[i] === answers[i]) count[1]++
if (candi3[i] === answers[i]) count[2]++
}
const score = Math.max(...count)
count.forEach((el, i) => {
if (el === score) answer.push(i + 1)
})
return answer;
}
이 문제를 처음 봤을 때, 시험은 최대 10,000 문제로 구성되어 있다는 제한 사항을 읽자마자 while을 써야겠다는 생각부터 들었다. 각 배열의 길이가 다르다보니 제일 짧은 배열의 길이가 10000을 넘도록 해두면 쉽게 풀리겠다... 뭐 그런 생각이었다.
문제를 해결하면 다른 사람들의 풀이를 볼 수 있는데, 그 중 나랑 비슷하면서도 while 부분 없이 해결한 사람이 있었다.
그 사람의 코드 일부
for(let i = 0; i < answers.length; i++) {
if(answers[i] == cand1[i % cand1.length]) count[0]++;
if(answers[i] == cand2[i % cand2.length]) count[1]++;
if(answers[i] == cand3[i % cand3.length]) count[2]++;
}
그 사람은 나처럼 while로 배열의 길이를 늘리는 게 아니라 i를 각 배열의 길이로 나눈 나머지 값을 인덱스로 사용했다. 이 방식을 사용하면 비단 이 문제 뿐만 아니라 서로 배열의 길이가 다른 A와 B 사이에서 특정 배열이 반복되며 비교해야 할 때 굉장히 유용할 것 같다.
오늘의 기억할만한 코드
// 배열의 0번째 인덱스부터 n번째 인덱스까지를
// 순서대로 반복할 수 있다
for(let i = 0; i < answers.length; i++) {
[i % arr.length]
}
블로그의 정보
Ayden's journal
Beard Weard Ayden