궁금한게 많은 코린이의 Developer 노트

[코딩 테스트] 수열과 구간 쿼리 2 본문

코딩테스트

[코딩 테스트] 수열과 구간 쿼리 2

lemonarr🍋 2025. 2. 19. 18:19

나의 문제 풀이

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        //[0,4,2] [] []
        for(int i = 0; i < queries.length; i++){
            int s = queries[i][0];  //0
            int e = queries[i][1];  //4
            int k = queries[i][2];  //2
            int minNum = Integer.MAX_VALUE;

            for(int j = 0; j <= 3; j++){    //0,1,2,3,4

                if(arr[j] < minNum && k < arr[j]){
                    minNum = arr[j];
                }
            }
            if(minNum != Integer.MAX_VALUE){
                answer[i] = minNum;
            }else{
                answer[i] = -1;
            }
        }
        return answer;
    }
}

 

자바에서 배열은 고정된 크기 이므로

int[] answer = [ ]; 의 경우,

answer는 길이가 0인 빈 배열이 됩니다. 이 경우, 배열의 크기가 0이기 때문에 새로운 값을 추가할 수 없습니다.

그래서 new int[queries.length];를 사용해서 각 쿼리의 결과를 저장하기 위해 queries의 길이만큼 초기화합니다.

for(int j = s; j <= e; j++){
    if(arr[j] < minNum && k < arr[j]){
        minNum = arr[j];
    }
}

s부터 e까지의 인덱스를 순회하며, arr[j]가 minNum보다 작고 k보다 큰 경우에만 minNum을 업데이트합니다.

if(minNum != Integer.MAX_VALUE){
    answer[i] = minNum;
}else{
    answer[i] = -1;
}

만약 minNum이 최대값이 아니라면(최댓값보다 작은 값이라면)~ answer에 값을 저장하고,

아닌 경우에는 -1을 저장합니다. 

 

 

 

다른 사람의 문제풀이

import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {

        int[] answer = new int[queries.length];
        Arrays.fill(answer, -1);

        for (int idx = 0; idx < queries.length; idx++) {
            int[] query = queries[idx];
            int s = query[0], e = query[1], k = query[2];

            for (int i = s; i <= e; i++) {
                if (k < arr[i]) {
                    answer[idx] = answer[idx] == -1 ? arr[i] : Math.min(answer[idx], arr[i]);
                }
            }

        }

        return answer;
    }
}

 

코드 설명

 

1.Arrays.fill(answer, -1)을 통해 answer 배열의 모든 요소를 -1로 초기화합니다. 이는 조건을 만족하는 값이 없을 경우를 나타내기 위해 사용됩니다.

2. 각 쿼리에서 시작 인덱스 s, 끝 인덱스 e, 그리고 비교할 값 k를 추출합니다.

3. if (k < arr[i]) 조건을 통해 현재 인덱스의 값이 k보다 큰지 확인합니다.

4. answer[idx] == -1인 경우, 즉 아직 값을 저장하지 않은 경우에는 arr[i]를 저장합니다.
그렇지 않은 경우, Math.min(answer[idx], arr[i])를 사용하여 현재 저장된 값과 arr[i] 중 더 작은 값을 저장합니다.

5. 모든 쿼리에 대한 처리가 끝난 후, answer 배열을 반환합니다.

 

 

다른사람의 문제풀이 2 - 스트림 사용

import java.util.stream.IntStream;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = {};
        return IntStream.range(0, queries.length)
                .map(q -> IntStream.rangeClosed(queries[q][0], queries[q][1])
                        .map(i -> arr[i])
                        .filter(i -> i > queries[q][2])
                        .min().orElse(-1)
                ).toArray();
    }
}

 

 

스트림을 사용한 문제풀이는 한눈에 봐도 가독성이 좋다는 것을 확실히 알 수 있다.

 

 

 

코드 설명

 

1. IntStream.range(0, queries.length)는 0부터 queries.length - 1까지의 정수 스트림을 생성합니다.

2. 각 쿼리 q에 대해, queries[q][0]부터 queries[q][1]까지의 인덱스를 포함하는 스트림을 생성합니다. ( j >= s; j<=e; j++ 부분 )

rangeClosed는 끝값을 포함합니다.

3. map(i -> arr[i])는 현재 쿼리의 범위 내에서 arr 배열의 값을 가져옵니다.

4. filter(i -> i > queries[q][2])는 쿼리의 세 번째 요소보다 큰 값만 남깁니다.

5. min() 메서드는 필터링된 값들 중에서 최소값을 찾습니다. 만약 조건을 만족하는 값이 없다면 orElse(-1)를 통해 -1을 반환합니다.

6. 최종적으로 각 쿼리에 대한 결과를 배열로 변환하여 반환합니다.