정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 i가 k의 배수이면 arr[i]에 1을 더합니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
처음에는 수열과 구간 쿼리 2에서 풀었던 것처럼 ArrayList 객체를 사용해 queries를 처리한 다음 정수형 배열에 담아 반환하려고 했다.
그런데 아래와 같이 코드를 짜니 코드가 지저분한 것도 지저분한 거지만 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0 에러가 났다. List 객체가 비어 있는데 list.get(i) == 0로 값을 확인하려고 한 게 문제였다. 여기서는 List 객체를 사용하지 못한다는 생각이 들었다.
문제를 찬찬히 다시 봤다.
import java.util.*;
class Solution {
public int[] solution(int[] arr, int[][] queries) {
List<Integer> list = new ArrayList<>();
for(int[] query : queries){
int s = query[0];
int e = query[1];
int k = query[2];
for(int i=s;i<=e;i++){
if(i%k == 0 && list.get(i) == 0){
list.add(arr[i] + 1);
}else if(i%k == 0 && list.get(i) != 0){
list.set(i, arr[i] + 1);
}
}
}
int[] answer = new int[list.size()];
for(int i=0;i<list.size();i++){
answer[i] = list.get(i);
}
return answer;
}
}
문제를 너무 복잡하게 생각했다는 걸 풀고나서 바로 깨달았다.
어떻게 하면 쉽게 풀까를 가장 먼저 생각해야 한다는 교훈을 얻었다.
그래서 다소 창피하지만 오답도 남겨둔다.
class Solution {
public int[] solution(int[] arr, int[][] queries) {
for(int[] query : queries){
int s = query[0];
int e = query[1];
int k = query[2];
for(int i=s;i<=e;i++){
if(i%k == 0){
arr[i] += 1;
}
}
}
return arr;
}
}

