SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
정답 코드
def dfs(idx, count):
global res
#바꾼 횟수 == 입력받은 횟수 일 때
if count == int(cnt):
#기존의 res와 바꾼 직후의 data중 큰 값을 삽입. 이 과정을 통해 최대res값을 매번 갱신
res = max(int(''.join(data)), res)
return
for now in range(idx, len(data)):
for max_idx in range(now + 1, len(data)):
if data[now] <= data[max_idx]:
#조건이 참일 때 서로를 스왑
data[now], data[max_idx] = data[max_idx], data[now]
#dfs함수를 재귀호출하여 count가 입력받은 횟수가 될 때까지 재귀 호출 반복
dfs(now, count + 1)
#재귀 호출한 함수가 완전히 return되면 스왑한 숫자판 원상복구
data[now], data[max_idx] = data[max_idx], data[now]
#res가 갱신되지 않고 dfs를 통해 숫자판을 완전탐색했음에도 입력받은 횟수를 못채웠을 경우
if not res and count < int(cnt):
#잔여횟수의 홀, 짝을 구함
extra = (int(cnt) - count) %
#잔여횟수가 홀수일 경우
if extra:
#숫자판의 뒤에서 첫번째 요소와 두번째요소를 스왑
data[-1], data[-2] = data[-2], data[-1]
dfs(idx, int(cnt))
t = int(input())
for tc in range(1, t + 1):
data, cnt = input().split()
data = list(data)
res = 0
dfs(0, 0)
print(f'#{tc} {res}')
숫자판의 모든 요소를 두개씩 비교해야 하므로 이중 for문을 돌린다. 이 때 뒷 요소가 앞 요소보다 크거나 같을 때 입력받은 횟수만큼 스왑하거나 모든 요소를 탐색할 때까지 재귀호출을 반복한다.
이처럼 DFS방식을 활용해서 모든 케이스를 완전탐색할 수 있다.
피드백
처음에 그리디로 접근했다가 한계를 느껴서 다른 사람들의 풀이를 보니 대부분 DFS로 풀었다.
여태까지 DFS, BFS로 풀었던 문제들은 그래프가 주어졌을 때 인접리스트 혹은 인접행렬에 집어넣고 이를 탐색하는 방식이었는데 이번 문제 처럼 그래프가 주어지지 않아도 응용해서 풀 수 있다는 걸 알 수 있었다.
'Algorithm > 그래프 탐색' 카테고리의 다른 글
| [Java] 프로그래머스 - 양과 늑대 (0) | 2023.12.16 |
|---|---|
| 백준 1012 - 유기농 배추 (파이썬) (0) | 2022.09.27 |
| 백준 1325-효율적인 해킹 (파이썬) (0) | 2022.09.13 |
| 백준 11725-트리의 부모 찾기 (파이썬) (0) | 2022.09.12 |
| 백준 1260-DFS와 BFS (파이썬) (0) | 2022.09.12 |