๐ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
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)์ด๋ค.
(์ ์ฒด ๊ณผ์ ์ค์์ ๊ฐ์ฅ ๋๋ฆฐ ์์ ์ธ ์ ๋ ฌ ์์ ์ด ์๊ฐ ๋ณต์ก๋์ ์ง๋ฐฐ ํญ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.)
'๐ป ์ฝํ > ๐ JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์ถ์ต ์ ์ (5) | 2025.08.11 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ (6) | 2025.08.10 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ์ด์ํ ์นธ (4) | 2025.08.04 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๋ถ๋ ๊ฐ๊ธฐ (3) | 2025.07.30 |
| [ํ๋ก๊ทธ๋๋จธ์ค/JAVA] ๊ฐ์ฅ ๋ง์ด ๋ฐ์ ์ ๋ฌผ (4) | 2025.07.26 |