๋ฌธ์ ์ ๊ทผ
https://school.programmers.co.kr/learn/courses/30/lessons/92342
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
์ ์ ์๋ ํ์ด์ ์ ์๊ฐ 0~11์ ๊น์ง๋ผ ์์ ํ์์ผ๋ก ์ ๊ทผํ๋ฉด ํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ฌ๊ท ๊ตฌํ์ด ์ฝํด์ ๊ทธ๋ฐ์ง ๊ตฌํ์ ์ด๋ ค์์ ๋๊ผ๋ ๋ฌธ์ ์๋ค.
๋ฌธ์ ํ์ด
์ฐ์ ์ด 3๊ฐ์ ํจ์๋ก ๋๋ ์ ๊ตฌํํ๋๊ฑธ ๋ชฉํ๋ก ์ก๊ณ ์์ํ๋ค.
1. ๋ผ์ด์ธ๊ณผ ์ดํผ์น์ ์ ์ ์ฐจ์ด๋ฅผ ๋ฐํํ๋ ํจ์
2. ์ ๋ต ๋ฐฐ์ด ์ค์ ๋๊ฐ ์ฐ์ ์์๊ฐ ๋์์ง๋ฅผ ๋ฐํํ๋ ํจ์
3. ์ฌ๊ท๋ฅผ ํตํด ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ ํจ์
๋ผ์ด์ธ๊ณผ ์ดํผ์น์ ์ ์ ์ฐจ์ด๋ฅผ ๋ฐํํ๋ ํจ์๋ ๋ฌธ์ ๊ทธ๋๋ก ํน์ ์ ์์ ๊ณผ๋ ์ ๋ํด ์ดํผ์น๊ฐ ๋ผ์ด์ธ๊ณผ ๊ฐ๊ฑฐ๋ ๋ ๋ง์ด ๋ง์ท์ผ๋ฉด ์ดํผ์น๊ฐ ์ ์๋ฅผ ํ๋ํ๋๊น ์ฐจ์ด๋ฅผ ๋ํ๋ด๋ diff ๋ณ์์์ ํด๋น ๊ณผ๋ ์ ์ ์ ๋งํผ์ ๋นผ์คฌ๊ณ ๋ผ์ด์ธ์ด ์ ์๋ฅผ ํ๋ํ ๊ฒฝ์ฐ๋ ๋ํด์คฌ๋ค.
์ ๋ต ๋ฐฐ์ด์ ์ฐ์ ์์๋ฅผ ์๋ ค์ฃผ๋ ํจ์๋ ๋ฌธ์ ์ ์กฐ๊ฑด๋๋ก ๋ฐฐ์ด์ ๋ค์์๋ถํฐ (๋ ๋ฎ์ ์ ์ ๋ถํฐ) ๋์ผํ ํ์ด์ ์๋ค๋ฉด ๋์ด๊ฐ๊ณ ๋ง์ฝ ๋ค๋ฅธ ๊ฐ์์ ํ์ด์ ๋ง์ท๋ค๋ฉด ๋น๊ตํ๋ ๋ฐฐ์ด์ด ๋ ๋ฎ์ ์ ์์์ ํ์ด์ ๋ง์ด ๋ง์ท๋์ง ์ฌ๋ถ๋ฅผ ๋ฐํํด์ค๋ค.
์ด์ ์ฌ๊ท๋ฅผ ํตํด ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ ํจ์์ธ๋ฐ ์ด ๋ถ๋ถ์ด ๊ฐ์ฅ ์ด๋ ค์ ์
์ฐ์ ๊ฐ์ฅ ํฐ ์ ์ ์ฐจ์ด๋ฅผ ๊ธฐ๋กํ๊ธฐ์ํด max ๋ณ์์ ๊ทธ ๋์ ๋งํ ๊ณผ๋ ์ ์์ ๊ฐ์๋ฅผ ๋ด์ maxArr ๋ฐฐ์ด์ ์ ์ธํ๋ค
์ ์ฒด์ ์ธ ํ๋ฆ์ 0๋ฒ ์ธ๋ฑ์ค(10์ ๊ณผ๋ )๋ถํฐ 10๋ฒ ์ธ๋ฑ์ค(0์ ๊ณผ๋ )๊น์ง ๋ผ์ด์ธ์ด ์ดํผ์น๋ฅผ ์ด๊ธฐ๊ธฐ ์ํด ํ์ํ ํ์ด (์ดํผ์น๊ฐ ํด๋น ๊ณผ๋ ์ ์ ํ์ด ๊ฐ์์ + 1)์ ๋ผ์ด์ธ์ด ๋จ์ ํ์ด๋ก ์ ์ ์๋ค๋ฉด ํด๋น ๊ณผ๋ ์์ ์ดํผ์น๋ฅผ ์ด๊ธฐ๋ ๊ฒฝ์ฐ์ ํด๋น ๊ณผ๋ ์ ์ ์๋ฅผ ํฌ๊ธฐํ๋ ๊ฒฝ์ฐ๋ก ๋๋ ์ ํ์์ด ์งํ๋จ
=> ์ดํผ์น๋ฅผ ์ด๊ธฐ๊ธฐ ์ํด ํ์ํ ํ์ด์ ๊ตฌํด์ฃผ๊ณ ๋จ์ ํ์ด n์ด ์ถฉ๋ถํ๋ค๋ฉด ํ์ฌ ๊ณผ๋ (idx ๊ฐ)์ ํด๋น ํ์ด์ ๊ฝ์์ค, ๊ทธ๋ฆฌ๊ณ idx๋ฅผ 1 ์ฆ๊ฐ์์ผ ๋ค์ ๊ณผ๋ ์ ๋ํ 2๊ฐ์ง ์ํ(์ดํผ์น๋ฅผ ์ด๊ธฐ๊ธฐ์ํ ๋งํผ์ ํ์ด์ ๊ฝ์, ํด๋น ๊ณผ๋ ์ ํฌ๊ธฐํจ)๋ฅผ ์ฌ๊ท๋ก ํธ์ถํจ
=> ์ด๋, ํด๋น ๊ฒฝ์ฐ์ ์(์ดํผ์น๋ฅผ ์ด๊ธฐ๊ธฐ ์ํ ๋งํผ์ ํ์ด์ ํ์ฌ idx ๊ณผ๋ ์ ๊ฝ์)๋ก ๋ถ๊ธฐ๋ฅผ ์์ผฐ๋ค๋ฉด (ํ์ฌ ๊ณผ๋ ์ ํ์ด์ ๊ฝ๊ณ ์ฌ๊ท๋ฅผ ํธ์ถํ๋ค๋ฉด) ํ์ฌ idx์ ์๋ ํ์ด์ hits[idx] = 0์ผ๋ก ์ด๊ธฐํ ์์ผ์ค์ผ ํ์ฌ ๊ณผ๋ ์ ํฌ๊ธฐํ๋ ๊ฒฝ์ฐ๋ ํ์ธํ ์ ์์
(ํ์ฌ ๊ณผ๋ ์ ํฌ๊ธฐํ๋ ๊ฒฝ์ฐ๋ idx๋ฅผ 1 ์ฆ๊ฐ์์ผ์ฃผ๊ณ hits์ n์ ๊ฑด๋ค์ง ์๊ณ ๋ฐ๋ก ์ฌ๊ท ํธ์ถ์ํจ)
์ข ๋ฃ์กฐ๊ฑด์ ๊ฒฝ์ฐ ๋ง์ฝ ํ์ฌ idx๊ฐ 10๊น์ง ์ฆ, 0์ ๊ณผ๋ ๊น์ง ๋๋ฌํ๋ค๋ฉด ๋จ์ ํ์ด ๊ฐ์์ธ n์ ์ ๋ถ 0์ ๊ณผ๋ ์ ์๋๊ฑธ๋ก ๊ฐ์ฃผํ๊ณ ์ด์ ์ ๋ง๋ค์๋ ๋ผ์ด์ธ๊ณผ ์ดํผ์น์ ์ ์ ์ฐจ์ด๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์ฌ์ฉํจ
=> ์ด๋ ๊ฒ ๋ฐํ๋ฐ์ ์ ์ ์ฐจ์ด๊ฐ ์์๋ผ๋ฉด ๋ผ์ด์ธ์ด ์ฐ์นํ ์ ์๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก ๋ฐ๋ก max, maxArr์ ๊ฐฑ์ ํ์ง ์๊ณ ์์๋ผ๋ฉด ๋ผ์ด์ธ์ด ์ฐ์นํ ๊ฒฝ์ฐ์ผํ ๋ฐ ์ด ๋ ์ ์ฅ๋ ์ต๋ ์ ์ ์ฐจ์ด๋ณด๋ค ํฐ ๊ฒฝ์ฐ max, maxArr์ ๊ฐฑ์ ํด์ค๋ค
์ต๋ ์ ์ ์ฐจ์ด๊ฐ ๋์ผํ๋ค๋ฉด ์ด์ ์ ๋ง๋ค์๋ ๋ฐฐ์ด์ ์ฐ์ ์์๋ฅผ ์๋ ค์ฃผ๋ ํจ์๋ฅผ ์ด์ฉํด์ ๋ง์ฝ ๊ฐฑ์ ์ด ํ์ํ๋ค๋ฉด maxArr์ ๊ฐฑ์ ํด์ค๋ค
=> ์ต๋ ์ ์๊ฐ ๋์ผํ๋ฏ๋ก max๋ ๊ฐฑ์ ์ํด๋๋จ
return์ ํตํด ์ด์ ์ฌ๊ท ๋จ๊ณ๋ก ๋์๊ฐ์ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ค์ ์ดํด๋ด์ผํ๋ฏ๋ก hits[10] = 0์ ํตํด ๋จ์ ํ์ด๋ค์ 0์ ์ ๊ฝ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ค์ ์ด๊ธฐํํด์ค
๋ง์ฝ ์์ ์ฌ๊ท๊ฐ ๋๋ฌ์ ๋ max์ ๊ฐ์ด ์ฒ์์ ์ด๊ธฐํํ Integer.MIN_VALUE๋ผ๋ฉด ๊ฐฑ์ ๋์ง ์์๋ค๋ ๋ป์ด๋ฏ๋ก ๋ผ์ด์ธ์ด ์ด๊ธธ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒ์
๊ทธ๋์ ์ด ๊ฒฝ์ฐ๋ -1์ ๋ฐฐ์ด์ ๋ด์ return ํด์ฃผ๊ณ ์๋๋ผ๋ฉด maxArr์ ๋ฐํํด์ฃผ๋ฉด ๋๋จ
์ ์ฒด ์ฝ๋
class Solution {
int[] maxArr = new int[11];
int max = Integer.MIN_VALUE;
// lion๊ณผ apeach์ ์ ์์ฐจ์ด๋ฅผ ๋ฐํํ๋ ํจ์
int diff(int[] lion, int[] apeach) {
int diff = 0;
for(int i = 0; i < 11; i++) {
if(apeach[i] == 0 && lion[i] == 0) continue;
if(apeach[i] >= lion[i]) {
diff -= (10 - i); // ์ดํผ์น๊ฐ ์ ์ ํ๋
} else {
diff += (10 - i); // ๋ผ์ด์ธ์ด ์ ์ ํ๋
}
}
return diff;
}
// ์ ๋ฐฐ์ด์ด ๊ธฐ์กด ๋ฐฐ์ด๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์์ง๋ฅผ ๋ฐํํ๋ ํจ์
boolean isPriority(int[] existArr, int[] newArr) {
for(int i = 10; i >= 0; i--) {
if(existArr[i] == newArr[i]) continue;
return existArr[i] < newArr[i];
}
return false;
}
void dfs(int idx, int[] hits, int n, int[] apeach) {
// 0์ ๊ณผ๋
(idx=10)๊น์ง ํ์์ ์๋ฃํ ๊ฒฝ์ฐ
if(idx == 10) {
// ๋จ์ ํ์ด(n)์ ๋ชจ๋ 0์ ๊ณผ๋
์ ์๋๊ฑธ๋ก ๊ฐ์ฃผ
hits[10] = n;
int currentDiff = diff(hits, apeach);
// ๋ผ์ด์ธ์ด ์ด๊ธด ๊ฒฝ์ฐ(diff > 0)์๋ง ๊ฒฐ๊ณผ ๊ฐฑ์
if(currentDiff > 0) {
// ์ต๋ ์ ์ ์ฐจ์ด๋ณด๋ค ํฐ ๊ฒฝ์ฐ
if(currentDiff > max) {
max = currentDiff;
maxArr = hits.clone(); // ๋ฐฐ์ด์ ๋ณต์ฌํด์ ์ ์ฅ
}
// ์ต๋ ์ ์ ์ฐจ์ด์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ฐ์ ์์ ๋น๊ต
else if (currentDiff == max && isPriority(maxArr, hits)) {
maxArr = hits.clone();
}
}
return;
}
// ํ์ฌ idx์ ์ ์๋ฅผ '์ด๊ธฐ๋' ๊ฒฝ์ฐ
int arrowsNeeded = apeach[idx] + 1; // ์ด๊ธฐ๊ธฐ ์ํด ํ์ํ ํ์ด
if(n >= arrowsNeeded) { // ๋จ์ ํ์ด์ด ์ถฉ๋ถํ๋ฉด
hits[idx] = arrowsNeeded;
dfs(idx + 1, hits, n - arrowsNeeded, apeach);
hits[idx] = 0; // ์๋ ํ์ด์ 0์ผ๋ก ์ด๊ธฐํ
}
// ํ์ฌ idx์ ์ ์๋ฅผ ํฌ๊ธฐํ๋ ๊ฒฝ์ฐ (0๋ฐ ์จ)
dfs(idx + 1, hits, n, apeach); // ๋ค์ ์ ์(idx+1) ํ์
}
public int[] solution(int n, int[] info) {
dfs(0, new int[11], n, info);
// ํ์์ด ๋๋ฌ๋๋ฐ max๊ฐ ๊ฐฑ์ ๋์ง ์์๋ค๋ฉด ๋ผ์ด์ธ์ด ์ด๊ธธ ์ ์๋ ๊ฒฝ์ฐ
if(max == Integer.MIN_VALUE) {
return new int[]{-1};
} else {
return maxArr;
}
}
}'๐ฅ Algorithm > ์์ ํ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค] ์ฒด์ก๋ํ (JAVA ํ์ด) (0) | 2025.10.31 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค] ์ฌ๋ผ์ง๋ ๋ฐํ (JAVA ํ์ด) (0) | 2025.10.28 |
| [ํ๋ก๊ทธ๋๋จธ์ค] ์๊ณผ ๋๋ (JAVA ํ์ด) (0) | 2025.10.26 |