수열과 구간 쿼리 2
문제
- 정수 배열 arr과 2차원 정수 배열 queries가 매개변수로 주어집니다.
- queries의 원소는 각각 [s, e, k] 형태입니다.
- queries의 각 원소는 s <= i <= e인
- i는 for문의 순회 횟수를 나타냅니다.
- 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
- 각 쿼리의 순서에 맞게 답을 저장한 배열을 출력하는 문제입니다.
- 단, 특정 쿼리가 존재하지 않으면 -1을 저장합니다.
- 입출력 예 (어디서 틀렸는지 확인하기 위해 테스트 케이스를 만들었습니다.)
-
arr queries result [0, 1, 2, 4, 3] [[0, 4, 2],[0, 3, 2],[0, 2, 2]] [3, 4, -1] [8, 4, 6, 1, 3, 5, 2] [[0, 6, 7], [1, 3, 4], [2, 5, 5]] [8, 6, 6] [10, 20, 30, 40, 50] [[0, 4, 25], [1, 3, 35], [0, 2, 15]] [30, 40, 20] [1, 2, 3, 4, 5] [[1, 4, 6], [0, 2, 0], [2, 4, 3]] [-1, 1, 4] [6, 5, 8, 10, 7] [[0, 2, 7], [2, 4, 6], [1, 3, 9]] [8, 7, 10]
-
테스트 (인텔리제이)
- for문으로 queries의 원소 배열을 하나씩 꺼낼 수 있게 설정합니다.
- queries의 원소 배열 하나가 수행되면 arr의 원소에서 조건에 맞는 수를 찾기 위한 temp 변수는 1000000으로 초기화 되도록 하고 queries의 배열 원소 안에 있는 원소를 하나씩 꺼내 각 변수를 새롭게 선언합니다.
- queries의 원소 배열 만든 변수로 for문의 시작과 끝나는 지점을 설정하고
- if문으로 arr의 원소와 queries의 원소 배열의 3번째 원소와 비교하여 temp에 값을 저장하도록 합니다.
- temp에 값을 저장하는 방법은 Math 클래스의 min 메서드를 이용하여 queries의 원소 배열의 3번째 원소보다 크면서 가장 작은 값을 구하도록 설정합니다.
- for문을 벗어나면 if문으로 temp의 값이 초기화 된 값과 일치하면 arr의 원소가 queries의 원소 배열의 3번째 원소보다 큰 값이 존재하지 않다는 의미이기 때문에 answer에 -1을 저장하도록 하면 됩니다.
- temp의 초기값을 1000000지정한 이유는 queries의 k자리 값의 제한 사항이 1000000까지이기 때문입니다.
package com.namji.codingtest;
import java.util.ArrayList;
import java.util.List;
public class 수열과_구간_쿼리_2{
public static void main(String[] args) {
/*
정수 배열 arr과 2차원 정수 배열 queries가 매개변수로 주어집니다.
queries의 원소는 각각 [s, e, k] 형태입니다.
queries의 각 원소는 s <= i <= e인
모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 출력하는 문제입니다.
단, 특정 쿼리가 존재하지 않으면 -1을 저장합니다.
입출력 예
arr
[0, 1, 2, 4, 3]
[8, 4, 6, 1, 3, 5, 2]
[10, 20, 30, 40, 50]
[1, 2, 3, 4, 5]
[6, 5, 8, 10, 7]
queries
[[0, 4, 2],[0, 3, 2],[0, 2, 2]]
[[0, 6, 7], [1, 3, 4], [2, 5, 5]]
[[0, 4, 25], [1, 3, 35], [0, 2, 15]]
[[1, 4, 6], [0, 2, 0], [2, 4, 3]]
[[0, 2, 7], [2, 4, 6], [1, 3, 9]]
result
[3, 4, -1]
[8, 6, 6]
[30, 40, 20]
[-1, 1, 4]
[8, 7, 10]
*/
int[] arr = {0, 1, 2, 4, 3};
int[][] queries = {{0, 4, 2}, {0, 3, 2}, {0, 2, 2}};
List<Integer> answer = new ArrayList<>();
for (int[] query : queries) {
int temp = 1000000;
int s = query[0], e = query[1], k = query[2];
for (int i = s; i <= e; i++) {
if (arr[i] > k) {
temp = Math.min(temp, arr[i]);
}
}
if (temp == 1000000){
temp = -1;
}
answer.add(temp);
}
System.out.println(answer);
}
}
/*
입출력 설명
#1
첫 번째 쿼리의 범위에는 0, 1, 2, 4, 3이 있으며 이 중 2보다 크면서 가장 작은 값은 3입니다.
두 번째 쿼리의 범위에는 0, 1, 2, 4가 있으며 이 중 2보다 크면서 가장 작은 값은 4입니다.
세 번째 쿼리의 범위에는 0, 1, 2가 있으며 여기에는 2보다 큰 값이 없습니다.
따라서 [3, 4, -1]을 return 합니다.
#2
첫 번째 쿼리 [0, 6, 7]에 대해서는, 범위 내에서 7보다 큰 수 중 가장 작은 수는 8입니다.
두 번째 쿼리 [1, 3, 4]에 대해서는, 범위 내에서 4보다 큰 수 중 가장 작은 수는 6입니다.
세 번째 쿼리 [2, 5, 5]에 대해서는, 범위 내에서 5보다 큰 수 중 가장 작은 수는 6입니다.
따라서 [8, 6, 6]을 return 합니다.
#3
첫 번째 쿼리 [0, 4, 25]에 대해서는, 범위 내에서 25보다 큰 수 중 가장 작은 수는 30입니다.
두 번째 쿼리 [1, 3, 35]에 대해서는, 범위 내에서 35보다 큰 수 중 가장 작은 수는 40입니다.
세 번째 쿼리 [0, 2, 15]에 대해서는, 범위 내에서 15보다 큰 수 중 가장 작은 수는 20입니다.
따라서 [30, 40, 20]을 return 합니다.
#4
첫 번째 쿼리 [1, 4, 6]에 대해서는, 범위 내에서 6보다 큰 수가 없기 때문에 -1입니다.
두 번째 쿼리 [0, 2, 0]에 대해서는, 범위 내에서 0보다 큰 수 중 가장 작은 수는 1입니다.
세 번째 쿼리 [2, 4, 3]에 대해서는, 범위 내에서 3보다 큰 수 중 가장 작은 수는 4입니다.
따라서 [-1, 1, 4]을 return 합니다.
#2
첫 번째 쿼리 [0, 2, 7]에 대해서는, 범위 내에서 7보다 큰 수 중 가장 작은 수는 8입니다.
두 번째 쿼리 [2, 4, 6]에 대해서는, 범위 내에서 6보다 큰 수 중 가장 작은 수는 7입니다.
세 번째 쿼리 [1, 3, 9]에 대해서는, 범위 내에서 9보다 큰 수 중 가장 작은 수는 10입니다.
따라서 [8, 8, 10]을 return 합니다.
*/
프로그래머스 코드
import java.util.*;
class Solution {
public List solution(int[] arr, int[][] queries) {
List<Integer> answer = new ArrayList<>();
for (int[] query : queries) {
int temp = 1000000;
int s = query[0], e = query[1], k = query[2];
for (int i = s; i <= e; i++) {
if (arr[i] > k) {
temp = Math.min(temp, arr[i]);
}
}
if (temp == 1000000){
temp = -1;
}
answer.add(temp);
}
return answer;
}
}
'Coding Test > Java Coding Test' 카테고리의 다른 글
[프로그래머스 / 자바] - 외계어 사전 (0) | 2024.08.12 |
---|---|
[프로그래머스 / 자바] - 정사각형으로 만들기 (4) | 2024.08.10 |
[프로그래머스 / 자바] - 무작위로 k개의 수 뽑기 (0) | 2024.08.08 |
[프로그래머스 / 자바] - 삼각형의 완성조건 2 (0) | 2024.08.07 |
[프로그래머스 / 자바] - 조건 문자열 (0) | 2024.08.06 |