알고리즘/알고리즘문풀

SW Expert Academy - 수영장 (python)

developer-ellen 2021. 10. 22. 19:19

❓ 문제 - SW Expert Academy - 수영장  python 풀이법

 

출처 

(https://swexpertacademy.com/main/solvingProblem/solvingProblem.do)

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

 

📝 문제해결법

1. 이 문제는 완전탐색(DFS)로 풀었다.

  • dfs를 돌려 1월달 부터 모든 경우의 수를 탐색한다.
  • 일단 이용금액의 최대 금액은 1년권이므로 최솟값을 갱신시킬 처음 값을 1년권의 금액으로 잡는다.
  • dfs를 계속 돌려 13월은 1년을 넘으므로 m-1월까지 이용했던 금액과 최솟값을 찾을 값을 비교해서 갱신한다.
  • m월부터 1일권, 한달권, 3개월권을 끊을 경우로 모두 탐색하여 계속 DFS를 돌린다.

2. 문제 풀면서 느낀점

  • 1년권을 고려할 필요가 없음. 그냥 최대값으로 잡으면 됨
  • 만약 이번달을 이용을 안해도 1일권, 한달권, 3개월권 모두 고려해서 탐색에 넣는다.

 

💻 소스코드

T = int(input())

def dfs(m, cash):
    global min_money
    if m >= 13:
        min_money = min(min_money, cash)
        return
    else:
        dfs(m+1, cash+money[0]*month[m])
        dfs(m+1, cash+money[1])
        dfs(m+3, cash+money[2])

for test_case in range(1, T+1):
    money = list(map(int, input().split()))
    month = [0] + list(map(int, input().split()))
    min_money = money[3]
    dfs(1, 0)

    print(f'#{test_case} {min_money}')