Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python](DFS) 백준 14501번 : 퇴사 (2가지 방법) 본문
728x90
<접근 방법 1>
- 문제에 있는 테이블 형태 그대로 Ti, Pi 리스트를 만든다.
- 상담일을 선택할 수도, 아닐 수도 있는 모든 경우를 생각하므로 dfs를 이용한다는 생각을 떠올린다.
- (DFS 안에서) 현재 날짜에서 걸리는 상담일을 더했을 때 마지막 날짜를 넘지 않을 경우,
다음 dfs로 넘길 수 있다는 조건을 이용한다. - 또한, 현재 상담일을 사용하지 않고 다음으로 그냥 넘기는 경우도 고려해 준다.
- 마지막 상담일에 다다랐을 때, answer를 cost의 최댓값으로 갱신해 준다.
def dfs(n, cost):
global answer
if n == N: # 마지막 상담일에 다다랐을 경우
answer = max(answer, cost)
return
if Ti[n] + n <= N: # 현재 날짜 + 걸릴 상담 기간 <= 마지막 상담일
dfs(n + Ti[n], cost + Pi[n])
dfs(n+1, cost) # 상담을 선택하지 않고 다음날로 넘길 때
N = int(input())
Ti, Pi = [], [] # Ti : 상담 걸리는 기간, Pi : 받을 수 있는 금액
for _ in range(N):
ti, pi = map(int, input().split())
Ti.append(ti)
Pi.append(pi)
# print("Ti :", Ti)
# print("Pi :", Pi)
answer = 0
dfs(0, 0)
print(answer)
<접근 방법 2>
- Ti, Pi 테이블 정보를 각기 다른 리스트로 만들지 말고 하나의 리스트로 만든다.
- 이하 동문
def dfs(n, cost):
global answer
if n == N: # 마지막 상담일에 다다랐을 경우
answer = max(answer, cost)
return
if info[n][0] + n <= N: # 현재 날짜 + 걸릴 상담 기간 <= 마지막 상담일
dfs(n + info[n][0], cost + info[n][1])
dfs(n+1, cost) # 상담을 선택하지 않고 다음날로 넘길 때
N = int(input())
info = []
for _ in range(N):
ti, pi = map(int, input().split())
info.append([ti, pi])
#print("info :", info)
answer = 0
dfs(0, 0)
print(answer)
이해가 안되는 부분이 있으면 질문 주세요. 감사합니다.
728x90
'삼성 SW 역량 테스트 기출 문제' 카테고리의 다른 글
[Python](구현, 조합) 백준 15685번 : 치킨 배달 (0) | 2024.01.18 |
---|---|
[Python](구현) 백준 14891번 : 톱니바퀴 (0) | 2024.01.18 |
[Python](구현) 백준 14503번 : 로봇 청소기 (0) | 2024.01.17 |
[Python](DFS) 백준 14888번 : 연산자 끼워넣기 (2) | 2024.01.16 |
[Python](DFS) 백준 14889번 : 스타트와 링크 (0) | 2024.01.15 |