๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/42889
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก, ์ฑ์ฉ๊น์ง Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๋ฌธ์ ์์ฝ
์คํจ์จ = ์คํ ์ด์ง์ ๋๋ฌํ์ผ๋ ์์ง ํด๋ฆฌ์ดํ์ง ๋ชปํ ํ๋ ์ด์ด ์/์คํ ์ด์ง์ ๋๋ฌํ ํ๋ ์ด์ด ์
์ ์ฒด ์คํ ์ด์ง ๊ฐ์, ๊ฐ ์ฌ์ฉ์๊ฐ ํ์ฌ ๋ฉ์ถฐ์๋ ์คํ ์ด์ง ๋ฒํธ stages๊ฐ ์ฃผ์ด์ง ๋ ์คํจ์จ์ด ๋์ ์คํ ์ด์ง๋ถํฐ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ฐํํ๊ธฐ
์ ํ
- ์คํ ์ด์ง์ ๊ฐ์ N์ 1 ์ด์ 500 ์ดํ์ ์์ฐ์์ด๋ค.
- stages์ ๊ธธ์ด๋ 1 ์ด์ 200,000 ์ดํ์ด๋ค.
- stages์๋ 1 ์ด์ N + 1 ์ดํ์ ์์ฐ์๊ฐ ๋ด๊ฒจ์๋ค.
- ๊ฐ ์์ฐ์๋ ์ฌ์ฉ์๊ฐ ํ์ฌ ๋์ ์ค์ธ ์คํ ์ด์ง์ ๋ฒํธ๋ฅผ ๋ํ๋ธ๋ค.
- ๋จ, N + 1 ์ ๋ง์ง๋ง ์คํ ์ด์ง(N ๋ฒ์งธ ์คํ ์ด์ง)๊น์ง ํด๋ฆฌ์ด ํ ์ฌ์ฉ์๋ฅผ ๋ํ๋ธ๋ค.
- ๋ง์ฝ ์คํจ์จ์ด ๊ฐ์ ์คํ ์ด์ง๊ฐ ์๋ค๋ฉด ์์ ๋ฒํธ์ ์คํ ์ด์ง๊ฐ ๋จผ์ ์ค๋๋ก ํ๋ฉด ๋๋ค.
- ์คํ ์ด์ง์ ๋๋ฌํ ์ ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ์คํ ์ด์ง์ ์คํจ์จ์ 0์ผ๋ก ์ ์ํ๋ค.
ํ์ด
์คํ ์ด์ง ๊ฐ์๋ ์ต๋ 500, ์ฌ์ฉ์ ์๋ ์ต๋ 200000์ ๋๋ค.
- stages๋ฅผ ์ํํ๋ฉด์ ๊ฐ ์คํ
์ด์ง๋ณ ๋๋ฌํ ํ๋ ์ด์ด ์, ๋๋ฌํ์ผ๋ ์์ง ํด๋ฆฌ์ดํ์ง ๋ชปํ ํ๋ ์ด์ด ์๋ฅผ ์นด์ดํธํ๋ค.
- 1๋ฒ ํ๋ ์ด์ด๊ฐ ๋๋ฌํ ์คํ ์ด์ง๊ฐ 4๋ผ๋ฉด, 1~4๋ ๋๋ฌํ ์คํ ์ด์ง๊ณ 4๋ ๋๋ฌํ์ผ๋ ์์ง ํด๋ฆฌ์ดํ์ง ๋ชปํ ์คํ ์ด์ง์ด๋ค.
- ์ํ๊ฐ ๋๋ ํ, ์คํ ์ด์ง๋ณ ์คํจ์จ์ ๊ณ์ฐํ๋ค.
- ์คํจ์จ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค. ์ ๋ ฌ ํจ์๋ฅผ ์ฌ์ ์ํ์ฌ, ์คํจ์จ์ด ๊ฐ์ผ๋ฉด ์์ ๋ฒํธ์ ์คํ ์ด์ง๊ฐ ๋จผ์ ์ค๋๋ก ํ๋ค.
์คํจ์จ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ , ์คํ ์ด์ง ๋ฒํธ๋ฅผ ๋ฐํํด์ผ ํ๋ฏ๋ก `<์คํ ์ด์ง ๋ฒํธ, ์คํจ์จ>` ํํ์ `HashMap`์ ๋ ์ฌ๋ฆด ์ ์์ต๋๋ค.
์ฒ์์๋ ์คํจ์จ์ด ๊ฐ์ ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ํด ์ง์ ์ ๋ ฌ ์ฝ๋๋ฅผ ์ง๊ตฌํํด์ผ ๋๋ ๊ณ ๋ฏผํ์ต๋๋ค.
ํ์ง๋ง `sort`ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๊ณ ๋ฏผ์กฐ์ฐจ ํ์ง ์์๋ ๋๋ค๋ ์ฌ์ค์ ๊นจ๋ฌ์์ต๋๋ค.
(์๋ฐ api๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ ํ์ฉํ ์ค ์๋ ์ฌ๋์ด ๋์!)
์ฝ๋
[1์ฐจ] - ํ๋ฆฐ ์ฝ๋
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] nonClear = new int[N+2];
for(int i=0; i<stages.length; i++){
nonClear[stages[i]]++;
}
HashMap<Integer,Double> fail = new HashMap<>();
int total = stages.length;
for(int i=1; i<=N; i++){
fail.put(i, (double)nonClear[i]/total);
total -= nonClear[i];
}
return fail.entrySet().stream().sorted((o1,o2) ->
Double.compare(o2.getValue(),o1.getValue()))
.mapToInt(e -> e.getKey()).toArray();
}
}
- ์ฒ์์๋ `์คํ ์ด์ง์ ๋๋ฌํ ์ฌ๋์ ์`๊ณผ `์คํ ์ด์ง์ ๋๋ฌํ์ผ๋ ์์ง ํด๋ฆฌ์ดํ์ง ๋ชปํ ์ฌ๋์ ์`๋ฅผ ๋ณ๋์ ๋ฐฐ์ด์ ์ ์ฅํ์ต๋๋ค.
- ํ์ง๋ง ๋ฐฐ์ด ํ ๊ฐ๋ง์ผ๋ก๋ ์คํจ์จ์ ๊ณ์ฐํ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ณ ์์ ํ์ต๋๋ค.
- ์๋ ์คํ ์ด์ง๋ถํฐ ์คํจ์จ์ ๊ณ์ฐํ๋ฉด์, ์ด์ ์คํ ์ด์ง์์ ํด๋ฆฌ์ดํ์ง ๋ชปํ ์ฌ๋๋ค์ total์์ ๋นผ๊ฐ๋ฉด ๋ฉ๋๋ค.
- ์ ์ฝ๋๋ ์ผ๋ถ ํน์ ํ
์คํธ ์ผ์ด์ค์์ ์คํจํ์ต๋๋ค.
- ์๊ณ ๋ณด๋, ์คํจ์จ์ด 0์ธ ๊ฒฝ์ฐ์ ๋ํด ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ ๋ฐ์ํ๋ ์ค๋ฅ์์ต๋๋ค.
- `double`์ 0/0์ ํด๋ฒ๋ฆฌ๋ฉด, ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ณ `Nan` ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค.
- (์ ํ ์ฌํญ์ ๊ผญ ๊ผผ๊ผผํ ์ฝ๋๋ก ํ์!)
- ์๊ณ ๋ณด๋, ์คํจ์จ์ด 0์ธ ๊ฒฝ์ฐ์ ๋ํด ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ ๋ฐ์ํ๋ ์ค๋ฅ์์ต๋๋ค.
โ HashMap์ ์ฌ์ฉํ ์ฝ๋
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] nonClear = new int[N+2];
for(int i=0; i<stages.length; i++){
nonClear[stages[i]]++;
}
HashMap<Integer,Double> fail = new HashMap<>();
int total = stages.length;
for(int i=1; i<=N; i++){
if(total==0){
fail.put(i,0.0);
continue;
}
fail.put(i, (double)nonClear[i]/total);
total -= nonClear[i];
}
return fail.entrySet().stream().sorted((o1,o2) ->
Double.compare(o2.getValue(),o1.getValue()))
.mapToInt(e -> e.getKey()).toArray();
}
}
[์๊ฐ ๋ณต์ก๋]
- M: stages์ ๊ธธ์ด = ์ฌ์ฉ์ ์
- N: stage ๊ฐ์
- ์ฒซ for๋ฌธ: O(M)
- ๋ ๋ฒ์งธ for๋ฌธ: O(N)
- ๋ง์ง๋ง sorted() : O(N logN)
- ์ต์ข ์๊ฐ ๋ณต์ก๋ = O(M)+O(N)+O(N log N) = O(M + N log N)
๐ท sorted ํจ์
- `sorted` ํจ์ ๋ด๋ถ์ ๋๋ค ํจ์๋ฅผ ์ ์ํ์ฌ, ์ ๋ ฌ ๊ธฐ์ค์ ๋ณ๊ฒฝํ์ต๋๋ค.
- `Double`์ `compare` ํจ์๋ฅผ ์ฌ์ฉํ์ฌ `o2.getValue()`์ `o1.getValue()`๋ฅผ ๋น๊ตํ๋๋ฐ, ์ฌ๊ธฐ์ ๋งค๊ฐ๋ณ์์ ์์๊ฐ ๊ต์ฅํ ์ค์ํฉ๋๋ค.
- sort ํจ์๋ ๋น๊ต ๊ฒฐ๊ณผ๊ฐ ์์์ด๋ฉด, o1๊ณผ o2์ ์์๋ฅผ ๋ฐ๊ฟ๋๋ค
- ๊ทธ๋ฆฌ๊ณ `compare`ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ compare ํจ์๋ "์์๋ฅผ ๋ฐ๊ฟ์ผ ํ ๋" ์์๋ฅผ ๋ฐํํ๋ ๊ตฌ์กฐ์
๋๋ค.
- o1=3, o2=4๋ผ๊ณ ํด๋ด ์๋ค. compare(o2, o1)=compare(4,3)=1 (์ค๋ฆ์ฐจ์ ๊ธฐ์ค์ผ๋ก ์์๋ฅผ ๋ฐ๊ฟ์ผ ํ๋ฏ๋ก 1)
- compare ๊ฒฐ๊ณผ๊ฐ ์์์ด๋ฏ๋ก sort ํจ์๋ o1๊ณผ o2์ ์์๋ฅผ ๋ฐ๊ฟ์ผ ํฉ๋๋ค. ๊ทธ๋ผ o2, o1 = 4,3 ์์๋ก ๋ด๋ฆผ์ฐจ์์ด ๋ฉ๋๋ค.
- `sorted((o1, o2) -> Double.compare(o2.getValue(), o1.getValue()))`
- ์ฝ๋์ ์ด ๋ถ๋ถ์ ๋ง๋ก ๋ค์ ์ ์ํด ๋ด
์๋ค.
- o2์ ๊ฐ์ด o1์ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด `compare`ํจ์๋ ์ค๋ฆ์ฐจ์ ๊ธฐ์ค์ ๋ฐ๋ผ ์์๋ฅผ ๋ฐ๊พธ๋ผ๋ ์๋ฏธ์์ ์์๋ฅผ ๋ฐํํ๊ณ , `sorted`ํจ์๋ ๋น๊ต ๊ฒฐ๊ณผ๊ฐ ์์์ด๋ฏ๋ก o1๊ณผ o2์ ์์๋ฅผ ๋ฐ๊พผ๋ค.
- “o2์ ๊ฐ์ด o1์ ๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด, o2๊ฐ o1๋ณด๋ค ์์ ์ค๊ฒ ์ ๋ ฌํ๋ค(o1๊ณผ o2์ ์์๋ฅผ ๋ฐ๊พผ๋ค)”
- = ํฐ ๊ฐ์ด ์์ ์จ๋ค = ๋ด๋ฆผ์ฐจ์
- ์ฝ๋์ ์ด ๋ถ๋ถ์ ๋ง๋ก ๋ค์ ์ ์ํด ๋ด
์๋ค.
- ๊ทธ๋ผ `compare` ํจ์์์ ๋ ๊ฐ์ด ๊ฐ์ ๋๋ ์ด๋ป๊ฒ ๋์ํ๋ ๊ฒ์ผ๊น์? ๋ฌธ์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ฅด๋ฉด, ๋ ๊ฐ์ด ๊ฐ์ ๋๋ ์์ ๋ฒํธ ์คํ
์ด์ง ๋จผ์ (ํค ๊ฐ ๊ธฐ์ค ์ค๋ฆ์ฐจ์) ๋์ํ๋๋ก ํด์ผ ํฉ๋๋ค.
- `compare` ํจ์๋ ๋น๊ตํ๋ ๋ ๊ฐ์ด ๊ฐ์ผ๋ฉด 0์ ๋ฐํํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ `sort` ํจ์๋ 0์ ๋ํด์๋ ๊ธฐ์กด ์์๋ฅผ ์ ์งํฉ๋๋ค.
- ์์ fail ๊ฐ๋ค์ ๊ณ์ฐํ์ฌ HashMap์ ์ฝ์ ํ ๋ ์คํ ์ด์ง ๋ฒํธ๋ฅผ ํ๋์ฉ ์ฆ๊ฐํ๋ฉฐ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ์์๋ฅผ ์ ์งํ๋ฉด ๊ฒฐ๊ตญ ์คํ ์ด์ง ๋ฒํธ ๊ธฐ์ค ์ค๋ฆ์ฐจ์์ ์ ์งํ๊ฒ ๋ฉ๋๋ค.
- ๋ฐ๋ผ์, ์ถ๊ฐ์ ์ผ๋ก ๋ ๊ฐ์ด ๊ฐ์ ๋์ ์ฒ๋ฆฌํ์ง ์์๋ ๋๋ ๊ฒ์ ๋๋ค.

โ ๋ค๋ฅธ ๋ฐฉ๋ฒ - HashMap ๋์ Class ์ ์ํด์ ํ์ฉ
์ธ๋ฑ์ค์ ์คํจ์จ์ ํ๋๋ก ๋ฌถ๊ธฐ ์ํด ์ด์ ์๋ `HashMap`์ ํ์ฉํ์ต๋๋ค.
ํ์ง๋ง `HashMap`๊ณผ `compare` ํจ์์ ๋ฌธ๋ฒ์ด ์ ๊ธฐ์ต๋์ง ์์ ์๋ ์์ต๋๋ค.
์ด๋ด ๋๋ ๋ณ๋์ `Class`๋ฅผ ๋ฐ๋ก ์ ์ํด์ ์ ๋ ฌ ์ฝ๋๋ฅผ ์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] nonClear = new int[N+2];
for(int i=0; i<stages.length; i++){
nonClear[stages[i]]++;
}
ArrayList<Stage>failStages = new ArrayList<>();
int total = stages.length;
for(int i=1; i<=N; i++){
if(total==0){
failStages.add(new Stage(i,0.0));
continue;
}
failStages.add(new Stage(i,(double)nonClear[i]/total));
total -= nonClear[i];
}
Collections.sort(failStages);
return failStages.stream().mapToInt(s -> s.id).toArray();
}
class Stage implements Comparable<Stage> {
public int id;
public double fail;
public Stage(int id, double fail){
this.id = id;
this.fail = fail;
}
@Override
public int compareTo(Stage s){
if(fail == s.fail){
if(id < s.id) return -1;
return 1;
}
if(fail>s.fail) return -1;
return 1;
}
}
}
- ์ ๋ ฌ ์ฝ๋๋ฅผ ์ง์ ๊ตฌํํ๋ ค๋ฉด, ๋ด๊ฐ ์ ์ํ ํด๋์ค๊ฐ `Comparable`์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉด `compareTo`ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์ง์ ์ ๋ ฌ ๊ธฐ์ค์ ์ ์ํ ์ ์์ต๋๋ค.
- `compareTo`ํจ์๋ ๋ ์์ ๊ฐ์ฒด์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ๋น๊ตํฉ๋๋ค.
- ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐํ๊ฐ์ด 1์ด๋ฉด ๊ฐ์ฒด์ ์์๋ฅผ ๋ฐ๊พผ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
'๐ช Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค] ๊ดํธ ํ์ ํ๊ธฐ (JAVA) (2) | 2025.02.04 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค] ๋ฐฉ๋ฌธ ๊ธธ์ด (JAVA) (2) | 2025.02.03 |
| [ํ๋ก๊ทธ๋๋จธ์ค] ํ๋ ฌ์ ๊ณฑ์ (JAVA) (1) | 2025.02.01 |
| [ํ๋ก๊ทธ๋๋จธ์ค] ๋ชจ์๊ณ ์ฌ (JAVA) (1) | 2025.01.30 |