저장을 습관화

프로그래머스 LV.0 수열과 구간 쿼리 4 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.0 수열과 구간 쿼리 4

ctrs 2023. 9. 27. 18:51

프로그래머스 LV.0 수열과 구간 쿼리 4

https://school.programmers.co.kr/learn/courses/30/lessons/181922

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 명

수열과 구간 쿼리 4


2. 문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.

 query마다 순서대로 s  i  e인 모든 i에 대해 i가 k의 배수이면 arr[i]에 1을 더합니다.

위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.


3. 제한 사항

  • 1 ≤ arr의 길이 ≤ 1,000
    • 0 ≤ arr의 원소 ≤ 1,000,000
  • 1 ≤ queries의 길이 ≤ 1,000
    • 0 ≤ s  e < arr의 길이
    • 0 ≤ k ≤ 5


4. 예시

arr queries result
[0, 1, 2, 4, 3] [[0, 4, 1], [0, 3, 2], [0, 3, 3]] [3, 2, 4, 6, 4]


5. 기본 제공 코드

function solution(arr, queries) {
    var answer = [];
    return answer;
}


6. 제출한 내 답

const solution = (arr, queries) => {
  return arr.map((v, i) => {
    for (j = 0; j < queries.length; j++) {
      if (i >= queries[j][0] && i <= queries[j][1] && i % queries[j][2] === 0) {
        v += 1;
      }
    }
    return v;
  });
};

 

6-2. VSC에 작성한 내용

const solution = (arr, queries) => {
  // queries[[0,3,2]] 이면,
  // arr[0] ~ arr[3]가 대상이 되고,
  // 이 중 인덱스가 2의 배수이면 해당 요소에 1을 더한다

  // 그렇다면 인덱스가 0인 경우는? => '0은 모든 정수의 배수이다.'
  // queries[[n,m,0]]인 경우는? => 0의 배수는 0 뿐이다.
  // 배수를 반대로 말하면 그 수에 의해 나누어 떨어지는 수이다.

  // 접근을 어떻게 해야할까
  // 1. queries를 검사한다.
  // arr[queries[0][0]] ~ arr[queries[0][1]]

  // 그렇다면 배열 메소드 안에서 배열 메소드를 사용하면?
  // foreach, reduce, map, filter
  // map안에 reduce, 그 대상은?
  return arr.map((v, i) => {
    for (j = 0; j < queries.length; j++) {
      if (i >= queries[j][0] && i <= queries[j][1] && i % queries[j][2] === 0) {
        v += 1;
      }
    }
    return v;
  });
};

// 테스트
console.log(
  solution(
    [0, 1, 2, 4, 3],
    [
      [0, 4, 1],
      [0, 3, 2],
      [0, 3, 3],
    ]
  )
);


7. 특이사항

굉장히 어려웠다

어떻게 접근해야할지 굉장히 헷갈렸다

이게 진짜 정답률 83%라고?


8. 다른 사람이 작성한 답

8-1. 가장 많이 쓰인 풀이법, for of 문

function solution(arr, queries) {
    for(let [s, e, k] of queries) {
        for(let i = s; i <= e; i++) {
            if(i % k === 0) arr[i]++;
        }
    }
    return arr;
}

 

8-2. 두번째로 많이 쓰인 풀이법, 중첩 for문

function solution(arr, queries) {
    for(let i = 0 ; i < queries.length ; i++){
        const[s,e,k] = queries[i];
        for(let j = s ; j <= e ; j++)
            if(j%k===0 ) arr[j]++;

    }
    return arr;
}