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()
자바에서 배열의 모든 값을 지정한 값으로 초기화하는 메서드
⭐️ 나중에 꼭 다시 풀어볼 것