일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 우선순위큐
- 구현
- 트리
- DP
- 브루트포스
- 그래프 탐색
- MST
- 분할정복
- 에라토스테네스의 체
- 백트래킹
- 다익스트라
- BFS
- 자료구조
- 누적합
- 해시
- 다시
- 그리디
- 플로이드-워셜
- 서브쿼리
- 수학
- GROUP BY
- join
- 크루스칼
- 시뮬레이션
- 그래프 이론
- 재귀
- 투포인터
- 다이나믹프로그래밍
- DFS
- 다이나믹 프로그래밍
- Today
- Total
기록하고 까먹지 말기
15663 본문
날짜 : 2023. 08. 31
사용 언어 : python
문제

코드
import sys
n, m = map(int, sys.stdin.readline().split())
nums = list(map(int, sys.stdin.readline().split()))
nums.sort()
res = list()
visited = [False] * n
def bt(depth):
if depth == m:
print(*res)
return
prev = 0
for i in range(n):
if not visited[i] and prev != nums[i]:
prev = nums[i] # 수열의 최신 원소
visited[i] = True # 방문처리
res.append(prev)
bt(depth + 1)
visited[i] = False
res.pop()
bt(0)
풀이
- DFS를 활용한 백트래킹을 사용해 문제를 풀이한다.
- 다만 중복이 되지 않는 수열을 만들어야 하기 때문에 앞서 숫자들을 입력받고 sort를 실행하여 재귀를 실행한다.
- 또한 같은 depth에서 동일한 값의 element가 기준이 되는 것을 방지하기 위해 이전값을 저장하기 위한 용도로 prev변수를 설정하고, 그 값을 저장하여 중복을 방지한다.
알게된 점
- 먼저 depth에 해당하는 수열들을 하나의 set에 저장한 후에 값들을 출력하려 했지만 set에는 리스트가 원소로 존재할 수 없었다.
- 그 다음 방법으로는 리스트를 미리 만들어서 depth에 해당하면 출력하는 방식으로 하려고 했지만 파이썬 언어 특성상 재귀 단계에 따라서 값이 계속 유동적으로 변화하는 속성이 있었기 때문에 원하는 결과가 나오지 않았다.
- 그래서 깊은복사로 문제를 풀어보려 했지만 동일한 값을 같은 depth에서 기준으로 잡았을 때의 케이스를 걸러낼 수 없어서 계속 오답이 나왔다.
- 때문에 다른사람들의 풀이를 참고했고, prev의 사용방식을 알 수 있었다. 처음에는 왜 이렇게 사용할까 의문이 들었지만, 직접 DFS 트리를 그려보고 로직을 따라가보니 해당 노드의 기준을 잡았을 때 prev를 잡는 이유를 확인할 수 있었다.
- 취업하고 오랜만에 코테를 풀어봤는데 감이 많이 떨어진 것 같다;; 최대한 꾸준히 풀면서 다시 감을 익혀나가야겠다.
참고 사이트
-