Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป ์ฝ”ํ…Œ/๐Ÿ“Œ JAVA

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/JAVA] ๋ฐ์ดํ„ฐ ๋ถ„์„

๋ฐ˜์‘ํ˜•

 

 

 

๐Ÿ”— ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

https://school.programmers.co.kr/learn/courses/30/lessons/250121?language=java

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 


๐Ÿ“Œ ๋ฌธ์ œ ์š”์•ฝ

 

 

๐ŸŽฏ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง  ํ›„ ์ •๋ ฌํ•˜๊ธฐ

  • ์ฃผ์–ด์ง„ data: ๊ฐ ์š”์†Œ๋Š” [code, date, maximum, remain]
  • ํ•„ํ„ฐ๋ง ์กฐ๊ฑด: ext ํ•„๋“œ๊ฐ€ val_ext ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ๋งŒ ์ถ”์ถœ
  • ์ •๋ ฌ ๊ธฐ์ค€: sort_by ํ•„๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
  • ext์™€ sort_by๋Š” "code", "date", "maximum", "remain" ์ค‘ ํ•˜๋‚˜

 


๐Ÿ’ก ์•„์ด๋””์–ด

1๏ธโƒฃ ํ•„๋“œ๋ช…์„ ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

2์ฐจ์› ๋ฐฐ์—ด data๋Š” ๊ฐ ํ–‰์ด [code, date, maximum, remain] ์ˆœ์„œ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์ด๋‹ค.

 

๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด,

int[][] data = {
    {1, 20300104, 100, 80},
    {2, 20300804, 847, 37},
    {3, 20300401, 10, 8}
};

 

๊ฐ ์—ด์˜ ์˜๋ฏธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ธ๋ฑ์Šค ์ด๋ฆ„ ์„ค๋ช…
0 code ์ฝ”๋“œ ๋ฒˆํ˜ธ
1 date ์ œ์กฐ์ผ (yyyymmdd)
2 maximum ์ตœ๋Œ€ ์ˆ˜๋Ÿ‰
3 remain ํ˜„์žฌ ๋‚จ์€ ์ˆ˜๋Ÿ‰

 

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ์—์„œ ext ์™€ sort_by ๋Š” ๋ฌธ์ž์—ด๋กœ ํ•„๋“œ๋ช…์ด ์ฃผ์–ด์ง€๋Š”๋ฐ,

์ด ๋ฌธ์ž์—ด์„ ์‹ค์ œ ๋ฐฐ์—ด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ ํ•„๋“œ๋ช…์„ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งคํ•‘์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.

Map<String, Integer> indexMap = new HashMap<>();
indexMap.put("code", 0);
indexMap.put("date", 1);
indexMap.put("maximum", 2);
indexMap.put("remain", 3);

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์ด์ œ ๋ฌธ์ž์—ด "date"๊ฐ€ ๋“ค์–ด์˜ค๋ฉด indexMap.get("date")๋ฅผ ํ†ตํ•ด 1์ด๋ผ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ฆ‰, "code", "date" ๋“ฑ ๋ฌธ์ž์—ด์„ ์ง์ ‘ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ , ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋กœ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

2๏ธโƒฃ ํ•„ํ„ฐ๋งํ•˜๊ธฐ

๋‹ค์Œ์œผ๋กœ๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฑธ๋Ÿฌ๋‚ด์•ผ ํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ext = "date" ์ด๊ณ , val_ext = 20300501 ์ด๋ผ๋ฉด,

์ œ์กฐ์ผ(date)์ด 20300501๋ณด๋‹ค ์ž‘์€ ํ•ญ๋ชฉ๋งŒ ํ•„ํ„ฐ๋งํ•ด์•ผ ํ•œ๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด์„œ, ๋จผ์ € ์•ž์„œ ๋งŒ๋“  indexMap์„ ํ™œ์šฉํ•˜์—ฌ "date"์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์–ป๊ณ ,

int extIndex = indexMap.get(ext); // ์˜ˆ: "date" → 1

 

๊ทธ ํ›„, ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•˜๋ฉด์„œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ•ญ๋ชฉ๋งŒ ๋ฆฌ์ŠคํŠธ์— ๋‹ด์œผ๋ฉด ๋œ๋‹ค.

for (int[] d : data) {
    if (d[extIndex] < val_ext) {
        filtered.add(d); // ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰๋งŒ ์ €์žฅ
    }
}

 

์ฆ‰, d[1] < 20300501 ์ธ ๊ฒฝ์šฐ๋งŒ ๊ณจ๋ผ๋‚ด๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

 

 

3๏ธโƒฃ ์ •๋ ฌํ•˜๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š”, ํ•„ํ„ฐ๋ง๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฆฌ์ŠคํŠธ filtered ๋ฅผ ์ •๋ ฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

์ •๋ ฌ ๊ธฐ์ค€์€ sort_by ๋ผ๋Š” ๋ฌธ์ž์—ด๋กœ ์ฃผ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์—

์ด ์—ญ์‹œ ์ธ๋ฑ์Šค๋กœ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

int sortIndex = indexMap.get(sort_by); // ์˜ˆ: "remain" → 3

 

์ •๋ ฌ ๊ธฐ์ค€์„ ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค๋ฉด,

์•„๋ž˜์™€ ๊ฐ™์ด Java์˜ Comparator๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •๋ ฌํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

filtered.sort(Comparator.comparingInt(o -> o[sortIndex]));

 

์ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

  • o๋Š” ํ•„ํ„ฐ๋ง๋œ ๊ฐ ํ–‰(๋ฐฐ์—ด)์ด๋‹ค.
  • o[sortIndex]๋Š” ์ •๋ ฌ ๊ธฐ์ค€์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด sort_by = "reamin" ์ด๋ผ๋ฉด ๐Ÿ‘‰๐Ÿป o[3] ์ฆ‰, ๋‚จ์€ ์ˆ˜๋Ÿ‰์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ชจ์€ ๋‹ค์Œ, ์ •๋ ฌ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 


๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ์ตœ์ข… ์ฝ”๋“œ

import java.util.*;

class Solution {
    public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
        Map<String , Integer> indexMap = new HashMap<>();
        indexMap.put("code", 0);
        indexMap.put("date", 1);
        indexMap.put("maximum", 2);
        indexMap.put("remain", 3);
        
        int extIndex = indexMap.get(ext);
        int sortIndex = indexMap.get(sort_by);
        
        List<int[]> filtered = new ArrayList<>();
        for(int[] d : data){
            if(d[extIndex] < val_ext){
                filtered.add(d);
            }
        }
        
        filtered.sort(Comparator.comparingInt(o -> o[sortIndex]));
        
        int[][] answer = new int[filtered.size()][];
        for(int i = 0; i < filtered.size(); i++){
            answer[i] = filtered.get(i);
        }
        
        return answer;
    }
}

 


๐Ÿ•‘ ์‹œ๊ฐ„ ๋ณต์žก๋„

1๏ธโƒฃ ํ•„๋“œ ์ธ๋ฑ์Šค ๋งคํ•‘

Map<String, Integer> indexMap = new HashMap<>();

 

์ด ๋ถ€๋ถ„์€ ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋‹ค.

 

 

2๏ธโƒฃ ํ•„ํ„ฐ๋ง ์ž‘์—…

for (int[] d : data) {
    if (d[extIndex] < val_ext) {
        filtered.add(d);
    }
}

 

data ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ ์ˆœํšŒํ•˜๋ฉฐ ์กฐ๊ฑด ๊ฒ€์‚ฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

 

 

3๏ธโƒฃ ์ •๋ ฌ ์ž‘์—…

filtered.sort(Comparator.comparingInt(o -> o[sortIndex]));

 

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Java ๋‚ด๋ถ€์—์„œ TimSort๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(M log M)์ด๋‹ค.

์ด๋•Œ, M์€ ํ•„ํ„ฐ๋ง๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

 

์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋“  ํ–‰์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฏ€๋กœ, M = N์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N log N)์ด๋‹ค.

 

 

4๏ธโƒฃ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ ์ž‘์—…

int[][] answer = new int[filtered.size()][];
for (int i = 0; i < filtered.size(); i++) {
    answer[i] = filtered.get(i);
}

 

๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐฐ์—ด๋กœ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

 

 

๐Ÿ‘‰๐Ÿป ๋”ฐ๋ผ์„œ ์ตœ์ข… ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N log N)์ด๋‹ค.

      (์ „์ฒด ๊ณผ์ • ์ค‘์—์„œ ๊ฐ€์žฅ ๋А๋ฆฐ ์ž‘์—…์ธ ์ •๋ ฌ ์ž‘์—…์ด ์‹œ๊ฐ„ ๋ณต์žก๋„์˜ ์ง€๋ฐฐ ํ•ญ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

๋ฐ˜์‘ํ˜•