• 분류 전체보기 (512)
    • 개발남노씨(Coding Test) (6)
    • 고농축 백엔드 (17)
    • 재귀함수 DFS 총정리 (1)
    • 프론트엔드 날개달기:Vuejs.React (1)
    • 훈훈한 javascript (5)
    • 렛츠기릿 자바스크립트 (18)
    • 나도코딩 (1)
      • 웹 스크래핑 (1)
    • 프로그래머스(자바스크립트) (41)
      • LV.0(자바스크립트) (41)
    • 프로그래머스(자바) (121)
      • LV.0(자바) (56)
      • LV.1(자바) (41)
      • LV.2(자바) (23)
    • 프로그래머스(파이썬) (127)
      • LV.0(파이썬) (46)
      • LV.1(파이썬) (51)
      • LV.2(파이썬) (30)
    • 임시저장소 (31)
    • 프로젝트 (0)
    • 자바 알고리즘 (13)
      • 알고리즘 직빵 자바 문법 (10)
      • String(문자열) (3)
    • 파이썬 알고리즘 (93)
      • 알고리즘 직빵 파이썬 문법 (20)
      • 알고리즘 백준 (2)
      • 파이썬 알고리즘(사고력기르기) (6)
      • 파이썬 탐색 & 시물레이션 (8)
      • 이분탐색 & 그리디 알고리즘 (10)
      • 스택, 큐, 해쉬, 힙 (10)
      • 완전탐색과 DFS기초 (12)
      • DFS, BFS 활용 (19)
      • 동적계획법 (6)
    • 자바 (27)
      • Java TPC(생각하고, 표현하고, 코딩하고) (17)
      • Java (중요하고, 이해 안 되고, 어려운) (10)
    • 스프링 (5)
      • 스프링 MVC 패턴 2편 (5)
hELLO · Designed By 정상우.
@@#@@

기록용 블로그

파이썬 알고리즘/DFS, BFS 활용

5.동전 분배하기(DFS)

2022. 11. 9. 22:01

동전 분배하기


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


▣ 입력설명
첫째 줄에는 동전의 개수 N(3<=N<=12)이 주어집니다.
그 다음 N줄에 걸쳐 각 동전의 금액이 주어집니다.


▣ 출력설명
총액이 가장 큰 사람과 가장 작은 사람의 최소차를 출력하세요.


▣ 입력예제 1
7
8
9
11
12
23
15
17


▣ 출력예제 1
5

 

 

문제풀이

import sys
sys.stdin=open("input.txt", "r")
def DFS(L):
    global res
    if L == n:
      gap = max(money)-min(money)
      if gap < res:
         tmp = set()
         for x in money:
            tmp.add(x)
            if len(tmp) == 3:
                  res = gap
         

    else:
      for i in range(0, 3):
           money[i] = money[i] + coin[L]
           DFS(L+1)
           money[i] = money[i] - coin[L]

         
if __name__=="__main__":
  n=int(input())
  money=[0]*3  
  coin=[]
  res=2147000000
  for i in range(n):
    a = int(input())
    coin.append(a)
  DFS(0)
  print(res)

 

Hint

▶ 3개의 값이 모두 같이 않은 경우를 도출하는 방법

      1. tmp라는 임시 set을 만든다.

      2. 만약에 tmp에 3개의 값을 저장한다.

      3. set 특성상 set은 순서가 없으며, 중복을 허용하지 않는다.

      4. 따라서 3개의 값이 모두 다르다면, set의 길이는 3이어야 한다.

 

▶ 아래와 같이 코드를 짜는 경우에는 DFS(L+1, sum +α)를 하지 않아도,

    해당 인덱스에 값을 누적할 수 있다. 

   for i in range(0, 3):
           money[i] = money[i] + coin[L]
           DFS(L+1)
           money[i] = money[i] - coin[L]

 

    

 

 

저작자표시 비영리 변경금지 (새창열림)

'파이썬 알고리즘 > DFS, BFS 활용' 카테고리의 다른 글

7. 송아지 찾기(BFS)  (0) 2022.11.10
6. 알파코드(DFS)  (0) 2022.11.10
4. 동전바뀌주기  (0) 2022.11.09
3. 양팔저울(DFS)  (0) 2022.11.09
2.휴가  (0) 2022.11.09
    '파이썬 알고리즘/DFS, BFS 활용' 카테고리의 다른 글
    • 7. 송아지 찾기(BFS)
    • 6. 알파코드(DFS)
    • 4. 동전바뀌주기
    • 3. 양팔저울(DFS)
    @@#@@
    @@#@@
    자바, 스프링, 알고리즘, 깃허브, 파이썬

    티스토리툴바