์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch06. Sorting and Searching(์ •๋ ฌ, ์ด๋ถ„๊ฒ€์ƒ‰๊ณผ ๊ฒฐ์ •์•Œ๊ณ ๋ฆฌ์ฆ˜) : ๋ฎค์ง๋น„๋””์˜ค (๊ฒฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜)

2023. 11. 9. 11:26ใ†์ธํ”„๋Ÿฐ/์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด ์ž…๋ฌธ : ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„

728x90

 

https://hyejin.tistory.com/1247

 

์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch06. Sorting and Searching(์ •๋ ฌ, ์ด๋ถ„๊ฒ€์ƒ‰๊ณผ ๊ฒฐ์ •์•Œ๊ณ ๋ฆฌ์ฆ˜) : ์ด๋ถ„ ๊ฒ€

https://hyejin.tistory.com/1246 ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch06. Sorting and Searching(์ •๋ ฌ, ์ด๋ถ„๊ฒ€์ƒ‰๊ณผ ๊ฒฐ์ •์•Œ๊ณ ๋ฆฌ์ฆ˜) : ์ขŒํ‘œ ์ • https://hyejin.tistory.com/1245 ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch06. Sorting and Searc

hyejin.tistory.com

-> ์ด์ „ ๋ฌธ์ œ ํ’€์ด 

 

 

 

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๋ฅผ ๋…น์Œํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์šฉ๋Ÿ‰์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค ! 

 

 

 

 

728x90

'์ธํ”„๋Ÿฐ > ์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด ์ž…๋ฌธ : ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch07. Recursive, Tree, Graph(DFS, BFS ๊ธฐ์ดˆ) : ์žฌ๊ท€ ํ•จ์ˆ˜  (0) 2023.11.17
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch06. Sorting and Searching(์ •๋ ฌ, ์ด๋ถ„๊ฒ€์ƒ‰๊ณผ ๊ฒฐ์ •์•Œ๊ณ ๋ฆฌ์ฆ˜) : ๋งˆ๊ตฌ๊ฐ„ ์ •ํ•˜๊ธฐ (๊ฒฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜)  (0) 2023.11.16
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch06. Sorting and Searching(์ •๋ ฌ, ์ด๋ถ„๊ฒ€์ƒ‰๊ณผ ๊ฒฐ์ •์•Œ๊ณ ๋ฆฌ์ฆ˜) : ์ด๋ถ„ ๊ฒ€์ƒ‰  (0) 2023.11.09
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch06. Sorting and Searching(์ •๋ ฌ, ์ด๋ถ„๊ฒ€์ƒ‰๊ณผ ๊ฒฐ์ •์•Œ๊ณ ๋ฆฌ์ฆ˜) : ์ขŒํ‘œ ์ •๋ ฌ  (1) 2023.11.08
์ž๋ฐ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์ž…๋ฌธ. ch06. Sorting and Searching(์ •๋ ฌ, ์ด๋ถ„๊ฒ€์ƒ‰๊ณผ ๊ฒฐ์ •์•Œ๊ณ ๋ฆฌ์ฆ˜) : ์žฅ๋‚œ ๊พธ๋Ÿฌ๊ธฐ  (1) 2023.11.08