Ayden's journal

배열의 인덱스를 한없이 순회하는 방법

문제 : 프로그래머스 레벨 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

활동하기