백준의 N과 M 시리즈는 N개의 숫자가 포함된 수열에서 M개를 고르는 문제이다. 매번 조건이나 규칙이 변경되어 총 12개의 문제가 있다. 이번 문제는 사전 순으로 증가하는 순서로 출력하는 문제이며 백트래킹을 이용하여 풀 수 있다. 난이도는 실버 3이다.
백준 15654번 N과 M (5) 문제 정보
알고리즘 분류
- 백트래킹
난이도
- 실버 3
N과 M (5) 문제 요약
중복 없는 N개의 숫자 중 M개를 선택하여 사전 순으로 증가하는 순서로 출력하는 문제다.
문제 풀이 과정
DFS를 이용하여 현재까지 방문하지 않은 숫자를 방문하고, M개의 숫자가 선택되면 출력한다. 사전 순으로 출력하기 위해 초기에 입력받은 수열을 정렬 후 수행한다.
코드
import sys
def dfs(cnt):
global N, M, num_list, visited
if cnt == M:
sys.stdout.write(' '.join(answer) + '\n')
return
for i in range(N):
if not visited[i]:
visited[i] = 1
answer.append(str(num_list[i]))
dfs(cnt+1)
visited[i] = 0
answer.pop()
if __name__ == '__main__':
N, M = map(int, input().split())
num_list = sorted(list(map(int, sys.stdin.readline().split())))
visited = [0 for _ in range(N)]
answer = []
dfs(0)
728x90
'알고리즘' 카테고리의 다른 글
[Python] Baekjoon - 1525. 퍼즐 (0) | 2021.07.17 |
---|---|
[Python] Baekjoon - 2751. 수 정렬하기 2 (0) | 2021.07.17 |
[Python] Baekjoon - 10026. 적록색약 (0) | 2021.07.14 |
[Python] Baekjoon - 10971. 외판원 순회 2 (0) | 2021.07.14 |
[Python] Baekjoon - 8980. 택배 (0) | 2021.07.14 |
댓글