๋ฌธ์ ์ค๋ช
https://school.programmers.co.kr/learn/courses/30/lessons/42889
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
์ํผ ๊ฒ์ ๊ฐ๋ฐ์ ์ค๋ ๋ฆฌ๋ ํฐ ๊ณ ๋ฏผ์ ๋น ์ก๋ค. ๊ทธ๋ ๊ฐ ๋ง๋ ํ๋์ฆ ์ค์ฒ์ฑ์ด ๋์ฑ๊ณต์ ๊ฑฐ๋์ง๋ง, ์์ฆ ์ ๊ท ์ฌ์ฉ์์ ์๊ฐ ๊ธ๊ฐํ ๊ฒ์ด๋ค. ์์ธ์ ์ ๊ท ์ฌ์ฉ์์ ๊ธฐ์กด ์ฌ์ฉ์ ์ฌ์ด์ ์คํ ์ด์ง ์ฐจ์ด๊ฐ ๋๋ฌด ํฐ ๊ฒ์ด ๋ฌธ์ ์๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํ ๊น ๊ณ ๋ฏผ ํ ๊ทธ๋ ๋ ๋์ ์ผ๋ก ๊ฒ์ ์๊ฐ์ ๋๋ ค์ ๋์ด๋๋ฅผ ์กฐ์ ํ๊ธฐ๋ก ํ๋ค. ์ญ์ ์ํผ ๊ฐ๋ฐ์๋ผ ๋๋ถ๋ถ์ ๋ก์ง์ ์ฝ๊ฒ ๊ตฌํํ์ง๋ง, ์คํจ์จ์ ๊ตฌํ๋ ๋ถ๋ถ์์ ์๊ธฐ์ ๋น ์ง๊ณ ๋ง์๋ค. ์ค๋ ๋ฆฌ๋ฅผ ์ํด ์คํจ์จ์ ๊ตฌํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ผ.
- ์คํจ์จ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค.
- ์คํ ์ด์ง์ ๋๋ฌํ์ผ๋ ์์ง ํด๋ฆฌ์ดํ์ง ๋ชปํ ํ๋ ์ด์ด์ ์ / ์คํ ์ด์ง์ ๋๋ฌํ ํ๋ ์ด์ด ์
์ ์ฒด ์คํ ์ด์ง์ ๊ฐ์ N, ๊ฒ์์ ์ด์ฉํ๋ ์ฌ์ฉ์๊ฐ ํ์ฌ ๋ฉ์ถฐ์๋ ์คํ ์ด์ง์ ๋ฒํธ๊ฐ ๋ด๊ธด ๋ฐฐ์ด stages๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์คํจ์จ์ด ๋์ ์คํ ์ด์ง๋ถํฐ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์คํ ์ด์ง์ ๋ฒํธ๊ฐ ๋ด๊ฒจ์๋ ๋ฐฐ์ด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ๋ผ.
์ ํ ์ฌํญ
- ์คํ ์ด์ง์ ๊ฐ์ N์ 1 ์ด์ 500 ์ดํ์ ์์ฐ์์ด๋ค.
- stages์ ๊ธธ์ด๋ 1 ์ด์ 200,000 ์ดํ์ด๋ค.
- stages์๋ 1 ์ด์ N + 1 ์ดํ์ ์์ฐ์๊ฐ ๋ด๊ฒจ์๋ค.
- ๊ฐ ์์ฐ์๋ ์ฌ์ฉ์๊ฐ ํ์ฌ ๋์ ์ค์ธ ์คํ ์ด์ง์ ๋ฒํธ๋ฅผ ๋ํ๋ธ๋ค.
- ๋จ, N + 1 ์ ๋ง์ง๋ง ์คํ ์ด์ง(N ๋ฒ์งธ ์คํ ์ด์ง) ๊น์ง ํด๋ฆฌ์ด ํ ์ฌ์ฉ์๋ฅผ ๋ํ๋ธ๋ค.
- ๋ง์ฝ ์คํจ์จ์ด ๊ฐ์ ์คํ ์ด์ง๊ฐ ์๋ค๋ฉด ์์ ๋ฒํธ์ ์คํ ์ด์ง๊ฐ ๋จผ์ ์ค๋๋ก ํ๋ฉด ๋๋ค.
- ์คํ ์ด์ง์ ๋๋ฌํ ์ ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ์คํ ์ด์ง์ ์คํจ์จ์ 0 ์ผ๋ก ์ ์ํ๋ค.
์ ์ถ๋ ฅ ์
| N | stages | result |
| 5 | [2, 1, 2, 6, 2, 4, 3, 3] | [3, 4, 2, 1, 5] |
| 4 | [4, 4, 4, 4, 4] | [4, 1, 2, 3] |
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
- 1๋ฒ ์คํ
์ด์ง์๋ ์ด 8๋ช
์ ์ฌ์ฉ์๊ฐ ๋์ ํ์ผ๋ฉฐ, ์ด ์ค 1๋ช
์ ์ฌ์ฉ์๊ฐ ์์ง ํด๋ฆฌ์ดํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ 1๋ฒ ์คํ
์ด์ง์ ์คํจ์จ์ ๋ค์๊ณผ ๊ฐ๋ค.
- 1๋ฒ ์คํ ์ด์ง ์คํจ์จ : 1/8
- 2๋ฒ ์คํ
์ด์ง์๋ ์ด 7๋ช
์ ์ฌ์ฉ์๊ฐ ๋์ ํ์ผ๋ฉฐ, ์ด ์ค 3๋ช
์ ์ฌ์ฉ์๊ฐ ์์ง ํด๋ฆฌ์ดํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ 2๋ฒ ์คํ
์ด์ง์ ์คํจ์จ์ ๋ค์๊ณผ ๊ฐ๋ค.
- 2๋ฒ ์คํ ์ด์ง ์คํจ์จ : 3/7
- ๋ง์ฐฌ๊ฐ์ง๋ก ๋๋จธ์ง ์คํ
์ด์ง์ ์คํจ์จ์ ๋ค์๊ณผ ๊ฐ๋ค.
- 3๋ฒ ์คํ ์ด์ง ์คํจ์จ : 2/4
- 4๋ฒ ์คํ ์ด์ง ์คํจ์จ : 1/2
- 5๋ฒ ์คํ ์ด์ง ์คํจ์จ : 0/1
- ๊ฐ ์คํ
์ด์ง์ ๋ฒํธ๋ฅผ ์คํจ์จ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- [3,4,2,1,5]
์ ์ถ๋ ฅ ์ #2
- ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋ง์ง๋ง ์คํ
์ด์ง์ ์์ผ๋ฏ๋ก 4๋ฒ ์คํ
์ด์ง์ ์คํจ์จ์ 1์ด๋ฉฐ ๋๋จธ์ง ์คํ
์ด์ง์ ์คํจ์จ์ 0์ด๋ค.
- [4,1,2,3]
๋ด๊ฐ ์์ฑํ ์ฝ๋
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
// ์ต์ข
๊ฒฐ๊ณผ (์คํ
์ด์ง ๋ณํธ ์ ๋ ฌ ๊ฒฐ๊ณผ)๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
int[] answer = new int[N];
// ๊ฐ ์คํ
์ด์ง์ ๋จธ๋ฌด๋ฅธ ์ธ์ ์๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด
// count[i] = i๋ฒ ์คํ
์ด์ง์์ ๋ฉ์ถ ์ฌ๋์ ์
int[] count = new int[N + 1];
for (int i : stages) {
// N+1์ ๋ชจ๋ ์คํ
์ด์ง ํด๋ฆฌ์ด์ด๋ฏ๋ก ์ ์ธ
if (i <= N) count[i]++;
}
// ์ ์ฒด ํ๋ ์ด์ด ์
int total = stages.length;
// ๊ฐ ์คํ
์ด์ง๋ณ ์คํจ์จ์ ์ ์ฅํ๋ ๋ฐฐ์ด
double[] fails = new double[N + 1];
// 1๋ฒ ์คํ
์ด์ง๋ถํฐ N๋ฒ ์คํ
์ด์ง๊น์ง ์คํจ์จ ๊ณ์ฐ
for (int i = 1; i <= N; i++) {
if (total == 0) {
// ๋ ์ด์ ๋์ ์๊ฐ ์์ผ๋ฉด ์คํจ์จ์ 0
fails[i] = 0.0;
} else {
// ์คํจ์จ = (์คํ
์ด์ง i์ ๋จธ๋ฌธ ์ฌ๋ ์) / (์คํ
์ด์ง i์ ๋์ ํ ์ฌ๋ ์)
fails[i] = (double) count[i] / total;
// ๋ค์ ์คํ
์ด์ง ๋์ ์ ์ ๊ฐฑ์
total -= count[i];
}
}
// ์คํจ์จ๊ณผ ์คํ
์ด์ง ๋ฒํธ๋ฅผ ํจ๊ป ์ ์ฅํ ๋ฆฌ์คํธ ์์ฑ
// double[] {์คํ
์ด์ง ๋ฒํธ, ์คํจ์จ}
List<double[]> failList = new ArrayList<>();
for (int i = 1; i <= N; i++) {
failList.add(new double[] {i, fails[i]});
}
// ์ ๋ ฌ ์กฐ๊ฑด:
// 1) ์คํจ์จ ๋ด๋ฆผ์ฐจ์
// 2) ์คํจ์จ์ด ๊ฐ๋ค๋ฉด ์คํ
์ด์ง ๋ฒํธ ์ค๋ฆ์ฐจ์
failList.sort(Comparator.comparing((double[] i) -> i[1]) // ์คํจ์จ ์ ๋ ฌ
.reversed() // ์คํจ์จ ๋ด๋ฆผ์ฐจ์
.thenComparing(i -> i[0])); // ์คํ
์ด์ง ๋ฒํธ ์ค๋ฆ์ฐจ์
// ์ ๋ ฌ๋ ๊ฒฐ๊ณผ์์ ์คํ
์ด์ง ๋ฒํธ๋ง ์ถ์ถํ์ฌ answer์ ์ ์ฅ
for (int i = 0; i < N; i++) {
answer[i] = (int) failList.get(i)[0];
}
// ์ต์ข
์คํ
์ด์ง ๋ฒํธ ๋ฐฐ์ด ๋ฐํ
return answer;
}
}
๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ์๊ฐํ ๋ฐฉํฅ
์ฒ์ ๋ฌธ์ ๋ฅผ ๋ดค์ ๋, ํต์ฌ์ ๊ฐ ์คํ ์ด์ง์ ์คํจ์จ์ ๊ณ์ฐํ๊ณ ์ด๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๋ค, ๊ทธ ์์๋๋ก ์คํ ์ด์ง ๋ฒํธ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ผ ํ๋จํ๋ค. ์คํจ์จ์ ํน์ ์คํ ์ด์ง์ ๋๋ฌํ์ง๋ง ํด๋ฆฌ์ดํ์ง ๋ชปํ ์ฌ๋ ์๋ฅผ ๋ถ์๋ก, ๊ทธ ์คํ ์ด์ง์ ๋์ ํ ์ ์ฒด ์ธ์์๋ฅผ ๋ถ๋ชจ๋ก ์ ์๋๋ค. ๋ฐ๋ผ์ ๊ฐ ์คํ ์ด์ง๋ณ๋ก "๋จธ๋ฌด๋ฅธ ์ฌ๋ ์"์ "๋์ ์ ์"๋ฅผ ์ ํํ ๊ตฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ๋จผ์ ํ์ํ ๊ณผ์ ์ด๋ผ๊ณ ๋ณด์๋ค.
์กฐ๊ฑด์ ๋ถ์ํด ๋ณด๋ฉด, ํ๋ ์ด์ด๊ฐ ์๋ ์์น stages ๋ฐฐ์ด์ ํตํด ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค. ์ด๋ค ๊ฐ์ด N ์ดํ๋ผ๋ฉด ๊ทธ ๊ฐ์ ํด๋น ์คํ ์ด์ง์์ ๋ฉ์ถ ์ฌ๋์ ์๋ฏธํ๊ณ , N+1์ ๋ชจ๋ ์คํ ์ด์ง๋ฅผ ํด๋ฆฌ์ดํ ๊ฒฝ์ฐ๋ผ ์คํจ์จ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ๋ฐ๋ผ์ ๊ฐ ์คํ ์ด์ง์ ๋จธ๋ฌด๋ฅธ ์ธ์์๋ ๋จ์ํ ์นด์ดํ ๋ฐฐ์ด์ ์ด์ฉํด ์ ์ ์๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํจ์จ์ ๊ณ์ฐํ๋ฉด ๋๋ค.
์๋ฃ๊ตฌ์กฐ๋ count ๋ฐฐ์ด๋ก ๊ฐ ์คํ ์ด์ง๋ณ ๋จธ๋ฌด๋ฅธ ์ธ์์ ์ ์ฅํ๊ณ , fails ๋ฐฐ์ด๋ก ์คํจ์จ์ ๋ฐ๋ก ์ ์ฅํ๋ ๋ฐฉ์์ ์ ํํ๋ค. ๋์ ์ ์๋ ์ ์ฒด ์ธ์ ์๋ก ์์ํด์, ์คํ ์ด์ง๋ฅผ ํ๋์ฉ ์ํํ๋ฉฐ ํ์ฌ ์คํ ์ด์ง์์ ๋ฉ์ถ ์ธ์๋งํผ ๋นผ ๋๊ฐ๋ฉด ๋์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋งค๋ฒ ๋ถ๋ชจ๋ฅผ ์๋ก ๊ณ์ฐํ ํ์ ์์ด O(1)๋ก ์คํจ์จ์ ๊ตฌํ ์ ์๋ค.
๋ก์ง์ ํ๋ฆ์ ๋จผ์ ๊ฐ ์คํ ์ด์ง์ ์คํจ์จ์ ๊ณ์ฐํด ๋ฐฐ์ด์ ์ ์ฅํ๊ณ , [์คํ ์ด์ง ๋ฒํธ, ์คํจ์จ] ์์ ๋ฆฌ์คํธ์ ๋ด์ ๋ค ์ ๋ ฌํ๋ ์์๋ค. ์ ๋ ฌ ์กฐ๊ฑด์ ์คํจ์จ ๋ด๋ฆผ์ฐจ์, ๋ง์ฝ ๊ฐ์ด ๊ฐ๋ค๋ฉด ์คํ ์ด์ง ๋ฒํธ ์ค๋ฆ์ฐจ์์ด๋ค. ๋ง์ง๋ง์ผ๋ก ์ ๋ ฌ๋ ๋ฆฌ์คํธ์์ ์คํ ์ด์ง ๋ฒํธ๋ง ์ถ์ถํ์ฌ ์ ๋ต ๋ฐฐ์ด์ ๋ด์ผ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์๊ฐ ๋ณต์ก๋๋ฅผ ๋ฐ์ ธ๋ณด๋ฉด, ํ๋ ์ด์ด ์ M์ ํ ๋ฒ ์ํํ์ฌ ์นด์ดํ ์ ๊ตฌํ๋ ๋ฐ O(M), ์คํ ์ด์ง N์ ๋ํด ์คํจ์จ์ ๊ณ์ฐํ๋ ๋ฐ O(N), ์ ๋ ฌ ๊ณผ์ ์์ O(N log N)์ด ์์๋๋ค. ๋ฐ๋ผ์ ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ O(M + N log N)์ผ๋ก, ๋ฌธ์ ์ ์ ์ฝ ์กฐ๊ฑด์์ ์ถฉ๋ถํ ํจ์จ์ ์ด๋ค.
'๐ฆ ํ๋ก๊ทธ๋๋จธ์ค > ๐๏ธ ์๊ณ ๋ฆฌ์ฆ ํ์ด(Java)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ๋ ๋งต๊ฒ (0) | 2025.09.23 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] k์ง์์์ ์์ ๊ฐ์ ๊ตฌํ๊ธฐ (0) | 2025.09.15 |
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] n์ง์ ๊ฒ์ (2) | 2025.09.02 |
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ๋ค์ ์๋ ํฐ ์ ์ฐพ๊ธฐ (2) | 2025.09.01 |
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ๋ฐฉ๋ฌธ ๊ธธ์ด (4) | 2025.08.25 |