궁금한게 많은 코린이의 Developer 노트
[코딩 테스트] 수열과 구간 쿼리 2 본문
나의 문제 풀이
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. 최종적으로 각 쿼리에 대한 결과를 배열로 변환하여 반환합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 수열과 구간 쿼리 4 (0) | 2025.02.28 |
---|---|
[코딩테스트] 프로그래머스 코드 처리하기 (0) | 2025.02.24 |
[Programmers] 수열과 구간 커리 2 (0) | 2024.12.22 |
[Programmers] 마지막 두 원소 (0) | 2024.12.18 |
[Programmers] 수 조작하기 (2) | 2024.12.18 |