๐Ÿ“ algorithm

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค | ์ˆ˜์—ด๊ณผ ๊ตฌ๊ฐ„ ์ฟผ๋ฆฌ 2

c0zi 2023. 9. 19. 13:48

๐Ÿง ๋ฌธ์ œ ์ด๋ฆ„

์ˆ˜์—ด๊ณผ ๊ตฌ๊ฐ„ ์ฟผ๋ฆฌ 2

 

 

๐Ÿงพ ๋ฌธ์ œ ์„ค๋ช…

์ •์ˆ˜ ๋ฐฐ์—ด arr์™€ 2์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด queries์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. queries์˜ ์›์†Œ๋Š” ๊ฐ๊ฐ ํ•˜๋‚˜์˜ query๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, [s, e, k] ๊ผด์ž…๋‹ˆ๋‹ค.

๊ฐ query๋งˆ๋‹ค ์ˆœ์„œ๋Œ€๋กœ s ≤ i ≤ e์ธ ๋ชจ๋“  i์— ๋Œ€ํ•ด k๋ณด๋‹ค ํฌ๋ฉด์„œ ๊ฐ€์žฅ ์ž‘์€ arr[i]๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

๊ฐ ์ฟผ๋ฆฌ์˜ ์ˆœ์„œ์— ๋งž๊ฒŒ ๋‹ต์„ ์ €์žฅํ•œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.
(๋‹จ, ํŠน์ • ์ฟผ๋ฆฌ์˜ ๋‹ต์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด -1์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.)

 

 

๐Ÿค™๐Ÿป ์ œํ•œ ์‚ฌํ•ญ

  • 1 ≤ arr์˜ ๊ธธ์ด ≤ 1,000
    • 0 ≤ arr์˜ ์›์†Œ ≤ 1,000,000
  • 1 ≤ queries์˜ ๊ธธ์ด ≤ 1,000
    • 0 ≤ s ≤ e < arr์˜ ๊ธธ์ด
    • 0 ≤ k ≤ 1,000,000

 

 

๐Ÿšฉ ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

  • arr : [0, 1, 2, 4, 3] 
  • queries : [[0, 4, 2],[0, 3, 2],[0, 2, 2]]
  • return : [3, 4, -1]
์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์˜ ๋ฒ”์œ„์—๋Š” 0, 1, 2, 4, 3์ด ์žˆ์œผ๋ฉฐ ์ด ์ค‘ 2๋ณด๋‹ค ํฌ๋ฉด์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์€ 3์ž…๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์˜ ๋ฒ”์œ„์—๋Š” 0, 1, 2, 4๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด ์ค‘ 2๋ณด๋‹ค ํฌ๋ฉด์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์€ 4์ž…๋‹ˆ๋‹ค.
์„ธ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์˜ ๋ฒ”์œ„์—๋Š” 0, 1, 2๊ฐ€ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—๋Š” 2๋ณด๋‹ค ํฐ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ [3, 4, -1]์„ return ํ•ฉ๋‹ˆ๋‹ค.

 


โ˜‘๏ธ ๋ฌธ์ œ ํ’€์ด

 

๐Ÿ“ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 1 - ArrayList๋งŒ ์‚ฌ์šฉ

 

์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋ณต์žกํ•ด์ง€๊ธด ํ–ˆ์ง€๋งŒ, ์ผ๋‹จ ๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ํ’€์—ˆ๋ƒ๋ฉด,

 

1. for-each๋ฌธ์„ ํ†ตํ•ด queries์˜ ํ–‰๋“ค์„ query๋กœ ๋ฐ›๋Š”๋‹ค.

2. ์ด์ค‘ for๋ฌธ์„ ์ด์šฉํ•ด ์ธ๋ฑ์Šค query[0]๋ถ€ํ„ฐ query[1]์— ํ•ด๋‹นํ•˜๋Š” arr๊ฐ’๋“ค์„ query[2]์™€ ๋น„๊ตํ•ด ํฌ๋ฉด ์ผ๋‹จ ArrayList์— addํ•œ๋‹ค.

3. ArrayList๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด -1์„, ๋“ค์–ด์žˆ๋‹ค๋ฉด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ Collections.min(arrayList)์„ ์ด์šฉํ•ด answer์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 ⇒ ์ด ๊ณผ์ •์—์„œ import java.util.Collection; ์ถ”๊ฐ€ ์•ˆํ•ด์ค˜์„œ ์—๋Ÿฌ ๋‚ฌ๋‹ค;; (์ธํ…”๋ฆฌ์ œ์ด์•ผ ๊ณ ๋งˆ์›Œ)

4. ArrayList๋ฅผ int[]๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋ฉด ๋๋‚œ๋‹ค.

 

import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        
        ArrayList<Integer> answer = new ArrayList<>();
        
        for (int[] query : queries) {
            
            ArrayList<Integer> list = new ArrayList<>();
            
            for (int i = query[0]; i <= query[1]; i++) {
                if (arr[i] > query[2]) {
                    list.add(arr[i]);
                }
            }
            
            if (list.isEmpty()) {
                answer.add(-1);
            } else {
                answer.add(Collections.min(list));
            }
        }
        
        int[] intArray = new int[answer.size()];
        
        for (int i = 0; i < answer.size(); i++) {
            intArray[i] = answer.get(i);
        }
        
        return intArray;
    }
}

 

๋ฌธ์ œ ํ’€๋ฉด์„œ ๊ฝค ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๊ณ , ํ™•์ธ ํ–ˆ์„  ๋•Œ ์‹คํŒจ๋„ ๋ช‡ ๋ฒˆ ๋‚˜์™”๋‹ค. 'queries[2]๋ณด๋‹ค ํฐ ์ˆ˜ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜'๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋‚˜ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ๋‹ค. 

 

ArrayList๋กœ ํ’€๋ฉด ๋˜์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ’€๋ฉด ๋‹ค์‹œ int[]๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ ๊ฒƒ ๊ฐ™์•„ ๋” ๊ฐ„๋‹จํ•œ ๋‹ต์„ ์ฐพ๊ณ  ์‹ถ์–ด ๋จธ๋ฆฌ ์ฅ์–ด์งœ๋‹ค๊ฐ€ ๊ทธ๋ƒฅ ArrayList๋กœ ํ’€์—ˆ๋‹ค.

 

๐Ÿ“ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 2 - fill, ์‚ผํ•ญ ์—ฐ์‚ฐ์ž

 

1. ์ด๋ถ„์€ Arrays.filll()๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ answer๋ฅผ ๋ชจ๋‘ -1๋กœ ์ฑ„์› ๋‹ค.

2. ๊ทธ ํ›„์— if๋ฌธ์„ ์ด์šฉํ•ด query[2]์™€ answer[idx] ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

3. answer๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด, ๊ทธ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ๋‹ค. 

 ⇒ answer[idx] = answer[idx] == -1 ? arr[i] : Math.min(answer[idx], arr[i]);

 

ํ’€์ด๋ฐฉ๋ฒ• ๋ณด๋ฉด์„œ ๊ฐํƒ„ํ–ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ -1๋กœ ์ฑ„์šด ํ›„์— -1์ด๋ฉด ๋„ฃ๊ณ , ์•„๋‹ˆ๋ฉด ๋” ์ž‘์€ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  Array.fill ๋ฉ”์†Œ๋“œ๋„ ์ฒ˜์Œ ์•Œ์•„์„œ ์œ ์šฉํ•œ ํ’€์ด๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค.

 

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;
    }
}

 

๐Ÿ“ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• 3 - Stream

 

์ด๋ ‡๊ฒŒ ์™„์ „ ๊น”๋”ํ•œ Stream์„ ํ†ตํ•ด ํ‘ธ์‹  ๋ถ„๋„ ๊ณ„์…จ๋‹ค. ๋‚œ ์•„์ง stream์„ ์ œ๋Œ€๋กœ ์“ธ ์ค„ ๋ชฐ๋ผ์„œ.. ๋” ๊ณต๋ถ€ํ•œ ๋’ค์— stream์œผ๋กœ ํ’€์–ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

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();
    }
}