알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
문제
[동전 분배하기(DFS)]
N개의 동전을 A, B, C 세명에게 나누어 주려고 한다. 세 명에게 동전을 적절히 나누어 주어, 세 명이 받은 각각의 총액을 계산한 후 총액이 가장 큰 사람과 가장 작은 사람의 차가 최소가 되도록 만들고자 한다.
(단, 세 사람의 총액은 서로 달라야 함)
위의 조건을 모두 만족하는 프로그램을 작성하시오.
*입력 설명
첫 번째 줄에는 동전의 개수 N(3 ≤ N ≤ 12)이 주어진다.
그 다음 줄부터 각 동전의 금액이 주어진다.
*출력 설명
총액이 가장 큰 사람과 가장 작은 사람의 최소차를 출력한다.
풀이(Python)
답안
import sys
sys.stdin = open('AA/input_60.txt', 'rt')
def DFS(L):
global res
if L == n:
cha = max(money) - min(money)
if cha < res:
tmp = set()
for x in money:
tmp.add(x)
if len(tmp) == 3:
res = cha
else:
for i in range(3):
money[i] += coin[L]
DFS(L+1)
money[i] -= coin[L]
if __name__ == "__main__":
n = int(input())
coin = []
money = [0] * 3
res = 2147000000
for _ in range(n):
coin.append(int(input()))
DFS(0)
print(res)
# 출력 : 5
input_60.txt(입력)
7
8
9
11
12
23
15
17
중요내용
- 변수 coin은 각 동전을 저장하는 리스트로 사용된다.
- 변수 money는 세 명에게 분배되는 동전의 총 금액을 저장하는 리스트이다.
- 변수 res는 금액 간의 최소차를 찾기 위해 사용된다.
- DFS() 함수의 인자 L은 상태트리의 레벨이자 동시에 각 동전에 접근하는 리스트의 인덱스 번호로 사용된다.
- 변수 money에 존재하는 동전의 총 금액이 중복되면 안되기 때문에, set 자료형을 활용하는 것이다.
- 상태트리의 노드에서 나오는 가지는 세 명 중에게 동전을 분배하는 역할을 한다. (DFS 문제는 반드시 상태트리 활용)
'알고리즘' 카테고리의 다른 글
Algorithm - 송아지 찾기(BFS : Breadth First Search) (0) | 2022.01.07 |
---|---|
Algorithm - 알파코드(DFS) (0) | 2022.01.05 |
Algorithm - 동전 바꿔주기(DFS) (0) | 2022.01.03 |
Algorithm - 양팔저울(DFS) (0) | 2022.01.03 |
Algorithm - 휴가(DFS) (0) | 2022.01.02 |
댓글