-

탐욕 알고리즘 :: 백준 :: 캔디캔디 :: 2879 본문

알고리즘/탐욕 알고리즘

탐욕 알고리즘 :: 백준 :: 캔디캔디 :: 2879

lingi04 2016. 12. 15. 18:12




아.. 어렵다


처음에 생각한 풀이법은

50 10

1

10

6

2

5

3

4

7

8

9

이런 입력이 주어졌다고 할 때, list[]에 저장한 뒤 sort를 하고 이분탐색으로 



 left

 

 

 mid

 

 

 

 

 

right 

1

2

3

4

5

6

7

8

9

10


50 -> 16


 

 

 

 

 left

 

mid 

 

 

right 

0

0

0

0

1

2

3

4

5

6


16 -> 1


 

 

 

 

 

 

 

 left

mid 

right 

0

0

0

0

0

0

0

1

2

3


위의 그림과 같이 왼쪽 범위의 숫자들을 0으로, 오른 쪽 범위의 숫자들은 list[mid]의 숫자만큼 빼주며 이분탐색을 진행하려 했으나

숫자가 작을 때, 과연 어느 숫자를 줄여줘야 할지...

이 경우에는 3을 1 줄이는 것이 최선이라는 것을 딱 알 수 있지만 다른 복잡한 경우는 어떻게 처리해야 할지 고민하다 결국 해결하지 못했다.


오래 고민을 하다 결국 해답을 봐버렸다..

구글 없었으면 아마 컴퓨터 공부 못했을 것 같다.


[풀이방법]

S : 친구들이 원하는 사탕 개수의 합

M : 가지고 있는 사탕의 수 라고 할때

K : 친구들이 받지 못하는 candy의 개수(S-M)

라 할때,


합이 일정할 때 요소들의 수가 같아야 최소다(예를 들어 1^2+7^2 > 4^2+4^2 인 것 처럼..)라는 사실을 바탕으로

친구들에게 사탕을 K개만큼 부족하게 잘 배분해야(...?!풀어쓰기 어렵다)

  -> 원하는 양 만큼의 사탕을 받지 못하는 친구들의 사탕의 개수가 최대한 비슷하도록! 배분해야함!!



Comments