문제 설명
정수 배열 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;
}
이렇게 애초에 특정 범위 내의 원소만 돌게 할 수 있다.
'코딩테스트 > 자바스크립트' 카테고리의 다른 글
[코딩 기초 트레이닝] 콜라츠 수열 만들기 (0) | 2025.01.23 |
---|---|
[코딩 기초테스트] 배열 만들기 2 (0) | 2025.01.22 |
[코딩 기초 트레이닝] 마지막 두 원소(feat.구조분해할당) (2) | 2024.06.21 |
[1213] 코딩테스트 - programmers (0) | 2021.12.13 |
[프로그래머스-javascript/level1] 김서방 찾기 (0) | 2021.05.26 |