본문 바로가기

알고리즘/이론

05. 조합 탐색 - 예제2

[1. 문제 설명]

m가지의 음식을 준비할 수 있고, n명의 친구를 초대하려고 한다.

각 친구가 먹을 수 있는 음식, 먹을 수 없는 음식이 주어질 때,

각 친구가 먹을 수 있는 음식이 최소한 하나씩 있게 하려면 

최소 몇가지의 음식을 해야하는가?


[2. 풀이 접근]

NP 완비 문제 중 하나로, 다항 시간에 푸는 방법은 아직 없다.

 

탐욕적 접근 방법으로 가장 많은 사람들이 먹을 수 있는 음식을 만들어 보는 방식으로 접근 할 수 있지만,

모든 입력에 대해 최적해를 찾아낼 수는 없다.

예제) ???

 

완전 탐색으로 접근 해서, 간단한 가지치기를 하면 답을 구할 수 는 있지만,

시간 내에 동작하지 않는다.

 

이 문제를 푸는 간단한 방법은 탐색의 형태를 바꾸는 것 이다.

매 재귀 호출마다 아직 먹을 음식이 없는 친구를 하나 찾은 뒤, 이 친구를 위해 어떤 음식을 만들지 결정 하는 것이다.

 

 

탐색의 방향을 바꿨을 때, 별다른 최적화 없이 더 빠른 이유는

  • 항상 모든 친구가 먹을 음식이 있는 조합만을 찾는다.
  • 매 호출마다, 항상 음식을 하나 하게 된다.
  • 불 필요한 음식을 하는 경우가 없다.

 

아래 방법을 이용하면 더 최적화 할 수 있다.

  • 먹을 수 있는 음식의 종류가 적은 친구를 찾도록 한다.
    => 
  • 가장 많은 사람이 먹을 수 있는 음식부터 시도한다.
    => 

[3. 코드]

 

'알고리즘 > 이론' 카테고리의 다른 글

06. 결정 문제 - 예제 2  (0) 2022.10.21
06. 결정 문제 - 예제1  (0) 2022.10.21
05. 조합 탐색  (0) 2022.10.09
04. 탐욕법 - 예제3  (0) 2022.10.03
04. 탐욕법 - 예제2  (0) 2022.10.03