코딩테스트/자바스크립트

[코딩 기초 트레이닝]수열과 구간 쿼리4

문앵 2025. 1. 21. 23:30

문제 설명

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

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

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

제한사항
1 ≤ arr의 길이 ≤ 1,000
0 ≤ arr의 원소 ≤ 1,000,000
1 ≤ queries의 길이 ≤ 1,000
0 ≤ s ≤ e < arr의 길이
0 ≤ k ≤ 5
입출력 예
arr queries result
[0, 1, 2, 4, 3] [[0, 4, 1],[0, 3, 2],[0, 3, 3]] [3, 2, 4, 6, 4]
입출력 예 설명
입출력 예 #1

각 쿼리에 따라 arr가 다음과 같이 변합니다.
arr
[0, 1, 2, 4, 3]
[1, 2, 3, 5, 4]
[2, 2, 4, 5, 4]
[3, 2, 4, 6, 4]
따라서 [3, 2, 4, 6, 4]를 return 합니다.
※ 2023년 04월 27일 입출력 예 설명이 수정되었습니다.
 


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

    return arr;
}
 
 
* TIL
1. JS에서 정수 크기를 비교할 때 , 한번에 세개의 정수를 비교하면 의도와 다르게 필터링 될 수 있다.
 
why? 비교문은 첫번째 비교연산자가 작동돼서, 그게 true인지 false 인지 먼저 나오고 true면 1로 false면 0 의 정수로 변환되어 들어간다(원래 비교 연산자로 비교할때는 모든 불리언 값이 정수화 됨.) 
 
그래서 만약
2<= 4 <=3
이라는 비교문을 사용하면
2<= 4 // true
true <=3
1 <=3 // true
이렇게 되어버려서 결국 2<= 4 <=3 이 true 가 되어버린다.
 
결론은 정수 비교할때 연산자를 하나씩 써서 분리하자.
 
2. 이중 for문 사용시 자식 for문의 시작 인덱스와 끝 인덱스를 컨트롤할 수 있다는걸 잊지 말자.
그래서 모든 원소에 대해서 돌지 말고 조건으로 걸러주면 조금 더 나은 효율의 코드가 된다.
 
for(let j=0;  j<arr.length; j++){
            if(s<=j && j<=e){
                arr[j] += 1;
            }
  }
이렇게 모든 원소를 돌고 그 안에서 조건을 추가할 필요 없이
 
for(let j=s;  j<=e; j++){
  arr[j] += 1;
 }
이렇게 애초에 특정 범위 내의 원소만 돌게 할 수 있다.

반응형