본문 바로가기

알고리즘 삽질장

[인프런] 동전 분배하기

반응형


문제설명

N개의 동전을 A, B, C 세명에게 나누어 주려고 한다. 세명에게 동전을 적절히 나누어 주어, 세 명이 받은 각각의 총액을 계산해, 총액이 가장 큰 사람과 가장 작은 사람의 차가 최소가 되도록 하자. 단 세사람의 총액은 서로 달라야 한다.

입력조건

  • 첫줄에는 동전의 개수 N(3 <= N <= 12)이 주어진다.
  • 그 다음 N줄에 걸쳐 각 동전의 금액이 주어진다.

출력조건

  • 총액이 가장 큰 사람과 가장 작은 사람의 최소차를 출력한다.

사고과정

  • 상태트리를 적절히 잘 구현했다! 상태트리의 레벨은 동전의 인덱스를, 갈래길은 해당 동전을 A, B, C 각각 사람에게 나누어줄 경우로 뻗어 나가면 된다. 단, 주의할 점은 다시 백트레킹할 때는 백트레킹하기 전 더해주었던 동전을 다시 빼주어야 한다!
  • 강의 속 풀이와 다른 점은 A, B, C 각 총액이 서로 달라야 한다는 조건 확인만 다르게 구현했다. 나는 하나의 if문으로 강의 속에서는 집합 자료구조를 활용해 구현했다.

풀이

- 나의 풀이

n = int(input())
coin = [int(input()) for _ in range(n)]
res = [0] * 3  # A, B, C 각 분배되는 동전
answer = 2174000000

def dfs(L):
    global answer
    if L == n:
        if res[0] != res[1] and res[1] != res[2] and res[0] != res[2]:
            answer = min(answer, max(res)-min(res))
        return
    else:
        for i in range(0, 3):  # A, B, C
            res[i] += coin[L]
            dfs(L+1)
            res[i] -= coin[L]

dfs(L=0)
print(answer)

- 강의 풀이

n = int(input())
coin = []
money = [0] * 3
res = 2147000000
for _ in range(n):
    coin.append(int(input()))


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]


DFS(0)
print(res)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[인프런] 송아지 찾기  (0) 2021.11.27
[인프런] 알파코드  (0) 2021.11.26
[인프런] 동전 바꿔주기  (0) 2021.11.26
[인프런] 양팔저울  (0) 2021.11.25
[인프런] 퇴사  (0) 2021.11.25