Algorithm Study

[Java Algorithm] 프로그래머스 Lv.0 _ 수열과 구간 쿼리 2

microsaurs 2025. 2. 24. 15:50

[문제]

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

 

[Algorithm]

반복문을 외부와 내부에 사용하여 조건을 만족하는 값을 찾는다.

1. 외부 반복문 

2차원 배열 queries의 길이만큼 실행

queries의 원소를 반복하면서 각 query의 원소들을 s,e,k에 각각 할당 + min값을 선언하여 조건에 이후 내부 반복문에서 조건에 알맞는 min값을 할당

2. 내부 반복문

s와 e 사이를 순회하면서 arr배열의 원소가 min보다 작고, k보다 큰 값을 찾아서 min에 할당하면서 반복문 실행 (if문 활용)

 

[Code]

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        for (int i = 0; i < queries.length; i++) {
            int s = queries[i][0];
            int e = queries[i][1];
            int k = queries[i][2];
            int min = Integer.MAX_VALUE;
            for (int j = s; j <= e; j++) {
                if (arr[j] < min && k < arr[j]) {
                    min = arr[j];
                }
            }
            if (min != Integer.MAX_VALUE) {
                answer[i] = min;
            } else {
                answer[i] = -1;
            }
        }
        return answer;
    }
}

 

아직도 제대로 이해하지 못함

너무 어려움.. 나중에 다시 풀어봐야함 !

 

 

[+ 다른 사람 풀이]

import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        // 결과를 저장할 배열을 생성하고 -1로 초기화합니다.
        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];

            // 주어진 범위 내에서 k보다 크면서 가장 작은 값을 찾습니다.
            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;
    }
}
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();
    }
}

 

 

[+ Plus]

* Arrays.fill()

자바에서 배열의 모든 값을 지정한 값으로 초기화하는 메서드

 

 

 

⭐️ 나중에 꼭 다시 풀어볼 것