2023. 11. 9. 11:26ใ์ธํ๋ฐ/์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ๋ฌธ : ์ฝ๋ฉํ ์คํธ ๋๋น
https://hyejin.tistory.com/1247
-> ์ด์ ๋ฌธ์ ํ์ด
9. ๋ฎค์ง๋น๋์ค (๊ฒฐ์ ์๊ณ ๋ฆฌ์ฆ)
์ค๋ช
์ง๋๋ ์ฝ๋์์๋ ๋ถ์ธ์ถ์ ๊ฐ์ ์กฐ์ํ์ ๋ผ์ด๋ธ ๋์์์ DVD๋ก ๋ง๋ค์ด ํ๋งคํ๋ ค ํ๋ค.
DVD์๋ ์ด N๊ฐ์ ๊ณก์ด ๋ค์ด๊ฐ๋๋ฐ, DVD์ ๋ นํํ ๋์๋ ๋ผ์ด๋ธ์์์ ์์๊ฐ ๊ทธ๋๋ก ์ ์ง๋์ด์ผ ํ๋ค.
์์๊ฐ ๋ฐ๋๋ ๊ฒ์ ์ฐ๋ฆฌ์ ๊ฐ์ ์กฐ์ํ์จ๊ฐ ๋งค์ฐ ์ซ์ดํ๋ค.
์ฆ, 1๋ฒ ๋ ธ๋์ 5๋ฒ ๋ ธ๋๋ฅผ ๊ฐ์ DVD์ ๋ นํํ๊ธฐ ์ํด์๋
1๋ฒ๊ณผ 5๋ฒ ์ฌ์ด์ ๋ชจ๋ ๋ ธ๋๋ ๊ฐ์ DVD์ ๋ นํํด์ผ ํ๋ค. ๋ํ ํ ๋ ธ๋๋ฅผ ์ชผ๊ฐ์ ๋ ๊ฐ์ DVD์ ๋ นํํ๋ฉด ์๋๋ค.
์ง๋๋ ์ฝ๋ ์ ์ฅ์์๋ ์ด DVD๊ฐ ํ๋ฆด ๊ฒ์ธ์ง ํ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์ฌ์ ์ ๋ญ๋น๋๋ DVD๋ฅผ ๊ฐ๊ธ์ ์ค์ด๋ ค๊ณ ํ๋ค.
๊ณ ๋ฏผ ๋์ ์ง๋๋ ์ฝ๋๋ M๊ฐ์ DVD์ ๋ชจ๋ ๋์์์ ๋ นํํ๊ธฐ๋ก ํ์๋ค. ์ด ๋ DVD์ ํฌ๊ธฐ(๋ นํ ๊ฐ๋ฅํ ๊ธธ์ด)๋ฅผ ์ต์๋ก ํ๋ ค๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ M๊ฐ์ DVD๋ ๋ชจ๋ ๊ฐ์ ํฌ๊ธฐ์ฌ์ผ ์ ์กฐ์๊ฐ๊ฐ ์ ๊ฒ ๋ค๊ธฐ ๋๋ฌธ์ ๊ผญ ๊ฐ์ ํฌ๊ธฐ๋ก ํด์ผ ํ๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ฐ์ N(1≤N≤1,000), M(1≤M≤N)์ด ์ฃผ์ด์ง๋ค.
๋ค์ ์ค์๋ ์กฐ์ํ์ด ๋ผ์ด๋ธ์์ ๋ถ๋ฅธ ์์๋๋ก ๋ถ๋ฅธ ๊ณก์ ๊ธธ์ด๊ฐ ๋ถ ๋จ์๋ก(์์ฐ์) ์ฃผ์ด์ง๋ค.
๋ถ๋ฅธ ๊ณก์ ๊ธธ์ด๋ 10,000๋ถ์ ๋์ง ์๋๋ค๊ณ ๊ฐ์ ํ์.
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค๋ถํฐ DVD์ ์ต์ ์ฉ๋ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํ์ธ์.
์์ ์ ๋ ฅ 1
9 3
1 2 3 4 5 6 7 8 9
์์ ์ถ๋ ฅ 1
17
ํํธ
์ค๋ช : 3๊ฐ์ DVD์ฉ๋์ด 17๋ถ์ง๋ฆฌ์ด๋ฉด (1, 2, 3, 4, 5) (6, 7), (8, 9) ์ด๋ ๊ฒ 3๊ฐ์ DVD๋ก ๋ น์์ ํ ์ ์๋ค.
๋ฌธ์ ํ์ด 1
public int solution(int n, int m, int[] arr)
{
int answer = 0;
int lt = Arrays.stream(arr).max().getAsInt();
int rt = Arrays.stream(arr).sum();
while (lt <= rt)
{
int mid = (lt + rt) / 2; // DVD ํ ์ฅ์ ์ฉ๋
int count = count(arr, mid);
if (count <= m) {
answer = mid;
rt = mid - 1;
}else
{
lt = mid + 1;
}
}
return answer;
}
public int count(int[] arr, int capacity)
{
int cnt = 1; // DVD ์ฅ ์
int sum = 0; // DVD์ ํ์ฌ ์ฉ๋ ํฉ
for (int x : arr)
{
if (sum + x > capacity) {
cnt++; // ์๋ก์ด ์ฅ ํ์
sum = x; // sum์ ์ฒซ๋ฒ์งธ ๊ฐ์ผ๋ก ์ด๊ธฐํ
}else {
sum += x;
}
}
return cnt;
}
๐พ : ๊ฒฐ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ด๋ป๊ฒ ํ์ด์ผํ๋์ง ๋ฐฉ๋ฒ์ด ์๊ฐ ์๋์... ๊ฒฐ๊ตญ ๋ฌธ์ ๋ฅผ ํ์ง ๋ชปํ๊ณ ๊ฐ์๋ฅผ ๋ค์ด๋ฒ๋ ธ๋ค...ใ
๋๋๋ก์ด๋ฉด ๊ฐ์ ์๋ฃ๊ณ ํ๋ ค๊ณ ๋ ธ๋ ฅํด์ผํ๋๋ฐ ๋๋ฌด ๋ต๋ตํด์ ๊ทธ๋ง... ใ ใ
(๊ฐ์๋ฅผ ๋ฃ๊ณ ๋ณด๋ ... ๊ทธ๋ฆฌ ์ด๋ ค์ด ๋ฌธ์ ๋ ์๋์์ ํ..)
์๊ณ ๋ณด๋ ์ผ๋จ ๊ฒฐ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ๋ง์ ๊ทธ๋ฅ ๊ฐ์ฌ๋์ด ์ง์ด๋ธ ๋จ์ด?์ด๊ณ , ์ผ๋จ ์ด ๋ฌธ์ ๋ ์ ๋ฒ ๋ฌธ์ ์์ ๋ฐฐ์ ๋ ์ด๋ถ ๊ฒ์์ ์ด์ฉํด์ ํธ๋ ๋ฌธ์ ์ด๋ค.
๋จผ์ ๋ฌธ์ ๋ DVD ์ต์ ์ฉ๋์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ธ๋ฐ, m๊ฐ์ DVD ์์ ๊ณก์ ๋ชจ๋ ๋ นํํด์ผ ํ๋ค.
int lt = Arrays.stream(arr).max().getAsInt();
int rt = Arrays.stream(arr).sum();
-> ์ด๋ถ ๊ฒ์์ด๋๊น lt, rt, mid ๋ณ์๋ฅผ ์ด์ฉํ ๊ฒ์ธ๋ฐ ์ฐ์ lt๋ ์ฃผ์ด์ง ๋ฐฐ์ด arr์ ์ต๋ ๊ฐ์ lt๋ก ์ก์์ค๋ค. arr์ ์ต๋๊ฐ์ด DVD ์ฉ๋์์ ๋ค์ด๊ฐ์ผ ํ๊ธฐ ๋๋ฌธ ! ๊ทธ๋ฆฌ๊ณ rt๋ arr ๋ฐฐ์ด์ ์ดํฉ์ผ๋ก ์ด๊ธฐํํด์ค๋ค. ์ดํฉ์ผ๋ก ์ด๊ธฐํํ๋ ์ด์ ๋ DVD๊ฐ 1๊ฐ์์ ์ฃผ์ด์ง ๊ณก๋ค์ ๋ค ๋ด์์ผ ํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
while (lt <= rt)
{
int mid = (lt + rt) / 2; // DVD ํ ์ฅ์ ์ฉ๋
int count = count(arr, mid);
if (count <= m) {
answer = mid;
rt = mid - 1;
}else
{
lt = mid + 1;
}
}
๊ทธ ๋ค์์ผ๋ก๋ ์ด์ ์ด๋ถ ๊ฒ์์ ํ๋ ๊ฑด๋ฐ while๋ฌธ ์กฐ๊ฑด์ผ๋ก ์ฐ์ lt ๊ฐ rt ๋ณด๋ค ํฌ์ง ์์ ๋๊น์ง ์ด๋ถ ๊ฒ์์ ํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ mid ๊ฐ์ ๊ตฌํด์ฃผ๋๋ฐ (lt + rt) /2 ํด์ mid ๊ฐ์ ๊ตฌํด์ค๋ค. (์ด๋ mid ๊ฐ DVD ํ ์ฅ์ ์ฉ๋์ด ๋๋ค.)
๊ทธ๋ฆฌ๊ณ count๋ผ๋ ๋ฉ์๋๋ฅผ ๋ง๋๋๋ฐ ๋งค๊ฐ๋ณ์๋ก๋ arr ๋ฐฐ์ด๊ณผ mid ๊ฐ์ ์ ๋ฌํ๋ค.
public int count(int[] arr, int capacity)
{
int cnt = 1; // DVD ์ฅ ์
int sum = 0; // DVD์ ํ์ฌ ์ฉ๋ ํฉ
for (int x : arr)
{
if (sum + x > capacity) {
cnt++; // ์๋ก์ด ์ฅ ํ์
sum = x; // sum์ ์ฒซ๋ฒ์งธ ๊ฐ์ผ๋ก ์ด๊ธฐํ
}else {
sum += x;
}
}
return cnt;
}
count ๋ฉ์๋์์๋ arr๊ณผ ์ฉ๋ mid ๊ฐ์ ๋ฐ๊ณ , cnt์ sum ๋ณ์๋ฅผ ์ ์ธํ๋ค. (์ด๋ cnt๋ DVD ์ฅ ์๋ฅผ ์๋ฏธํ๋ฉฐ, sum์ DVD ์ ํ์ฌ ์ฉ๋ ํฉ์ ์๋ฏธํ๋ค.)
์ฃผ์ด์ง ๋ฐฐ์ด arr์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋๋ฉด์ sum + x ๊ฐ capacity (mid) ๊ฐ๋ณด๋ค ํฌ๋ฉด.. ! DVD์ ์ฉ๋์ ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ cnt ์ ๊ฐ์ +1 ํด์ฃผ๊ณ (DVD ๊ฐ์ ์ถ๊ฐ), ๊ทธ ๋ค์ sum์ x์ ๊ฐ์ผ๋ก ์ด๊ณผํด์ค๋ค. (sum์๋ ์ด์ ์ด๊ณผํ๊ฒ ๋ ๊ทธ ๊ฐ x ๋ถํฐ ๋ค์ ์๋ก์ด DVD์ ๋ น์ํด์ค๋ค๋ ์๋ฏธ ! )
๋ง์ฝ sum + x๊ฐ capacity (mid) ๋ณด๋ค ์์ผ๋ฉด sum์ ๊ทธ๋ฅ x ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๋ฐ๋ณตํด์ฃผ๊ณ ๋ง์ง๋ง์ cnt (DVD ์ ๊ฐ์)๋ฅผ ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ค.
if (count <= m) {
answer = mid;
rt = mid - 1;
}else
{
lt = mid + 1;
}
solution ๋ฉ์๋์์ ๋ค์ ์ด count() ๋ฉ์๋์์ ๋ฆฌํด๋ฐ์ ๊ฐ์ count ๋ผ๋ ๋ณ์์ ๋ด๊ณ ,
์ด count ๊ฐ์ด ์ฃผ์ด์ง ๊ฐ m ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ์ฐ์ answer์ mid ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ , ํ์ฌ ์ฉ๋๋ณด๋ค๋ ๋ ์ ์ ์ฉ๋์ผ๋ก๋ ๋ด์ ์ ์์์ง๋ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์rt๋ฅผ mid -1 ๋ก ๋ฐ๊ฟ์ ๋ค์ mid๋ฅผ ๊ตฌํด count ๋ฉ์๋์ ๋ณด๋ด๋ณธ๋ค.
๋ฐ๋ฉด count ๊ฐ m๋ณด๋ค ํฌ๋ฉด ํ์ฌ mid ์ฉ๋์ผ๋ก์ count ๊ฐ์๋ก๋ ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ชจ๋ ๋ค ๋ด์ง ๋ชปํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก lt๋ฅผ mid + 1๋ก ์ฎ๊ฒจ์ ๋ค์ count ๋ฉ์๋์์ ๊ฐ์ ๊ตฌํด๋ณธ๋ค.
์ด๋ ๊ฒ ๋ฐ๋ณตํ๋ค ๋ณด๋ฉด ๋ชจ๋ ๊ณก๋ค์ ์ฃผ์ด์ง m ๊ฐ ์์์ DVD๋ฅผ ๋ น์ํ ์ ์๋ ์ต์ ์ฉ๋์ ๊ตฌํ ์ ์๋ค !