본문 바로가기
Coding Test/Java Coding Test

[프로그래머스 / 자바] - 수열과 구간 쿼리 2

by nam_ji 2024. 8. 9.

수열과 구간 쿼리 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;
    }
}