수열과 구간 쿼리 2

이리·2024년 7월 31일
0
post-thumbnail
post-custom-banner

문제 (프로그래머스 181943 : 수열과 구간 쿼리 2)
181943 : 수열과 구간 쿼리 2

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

문제파악

  • 주어진 parameter : 정수형 배열 arr, 2차원 정수형 배열 queries
  • 문제부터 무슨말인지 몰라 한참 읽었다.. (국어능력 반성해..)
  • query의 원소 중 s e k 순서라고 했을때 s~e사이에서 k 보다 큰 모든 값의 arr[i] 중 가장 작은 값을 찾기
  • 배열에 하나씩 추가하기

접근방법

  • answer ⇒ 하나씩 추가할것이기 때문에 List로 두는게 나을것 같다.. (총 몇개 나올지 모르니까?)
  • 1단계 ) query에 하나씩 접근해서 풀어나간다.. i를 찾기

코드구현

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        
        // 답변 받을 리스트 선언 
        List<Integer> answer = new ArrayList<>();
        
        // 변수 지정
        int num = queries.length;
        
        // query 하나씩 순회 
        for(int j = 0 ; j < num ; j++){
            int s = queries[j][0];
            int e = queries[j][1];
            int k = queries[j][2];
            
            // min 초기화 
            int min = 1000000;
            
            // i 찾기 (k보다 크면서 e보다 작거나 같음)
            for(int l = s ; l <= e ; l++){
                
                // arr[i] 중 가장 작은 값을 찾기 
                if(arr[l] > k){
                    if(arr[l] < min){
                        min = arr[l];   
                    }
                }
            }
            
            // 언제 추가해야하지? >> for문 하나 끝나면 min 추가 
            // List라 배열에 바로 추가할수없음 
            if(min == 1000000){
                answer.add(-1);
            }else{
                answer.add(min);
            }
                
            
        }
        
        // List > int형 배열 
        int[] answerB = new int[answer.size()];
        for(int i = 0; i < answer.size(); i++){
            answerB[i] = answer.get(i).intValue();
        }
        
        return answerB;
    }
}

배운점

  1. 반복 루프를 돌때 범위를 정확하게 설정하자..
  2. 좀 더 쉬운 방법이 없을까?
import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int idx = 0;
        int[] answer = new int[queries.length];

        for (int[] query : queries) {
            int s = query[0], e = query[1], k = query[2];
            int min = Integer.MAX_VALUE;

            for (int i = s;i <= e;i++)
                if (arr[i] > k)
                    min = Math.min(arr[i], min);

            answer[idx++] = min == Integer.MAX_VALUE ? -1 : min;
        }

        return answer;
    }
}

[출처] https://school.programmers.co.kr/learn/courses/30/lessons/181923/solution_groups?language=java - Hyeona님 코드

! 배울점

  • 향상된 for문은 한결 간결하다.
  • Math.min(A, B) ⇒ 주어진 숫자 중 가장 작은 수를 반환, 매개변수가 없다면 infinity를 반환 ⇒ 알아두면 유용할듯!
  • 삼항 연산자.. 간결함의 끝인것같다..
post-custom-banner

0개의 댓글