728x90
재활을곁들인 . .
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
1. 옛날에 풀었던 코드
주석은 많지만 이해했던건지 모르겠다. global ans를 쓴거나 코드를 길게쓴거는 이해되는데 매개변수 1은 왜쓴거지싶다.
# N까지의 자연수, 중복없이 M개
N, M = map(int, input().split())
# 부분집합용 리스트
arr = []
# 중복방지용 방문 (자연수가1부터니까 인덱스 +1)
visited = [False for _ in range(N+1)]
def recur(cur):
global ans
if len(arr) == M: # 부분집합길이가 M이 되면
# sort?
ret = arr[:]
ret.sort()
if ret not in ans:
ans.append(ret)
# print(*arr)
return
for i in range(1, N+1): # 1부터 N까지의 자연수
if visited[i]: # True
continue
visited[i] = True
arr.append(i) # 부분집합 리스트로 추가
recur(cur+1)
arr.pop()
visited[i] = False
ans = []
recur(1)
for line in ans:
print(*line)
2. 최신
사실 어쩌다운좋게 풀었다.
N, M = map(int, input().split())
def back():
if len(arr) == M:
temp = sorted(arr)
if temp not in results:
results.append(temp)
return
for i in range(1, N+1):
if visited[i]:
continue
visited[i] = True
arr.append(i)
back()
arr.pop()
visited[i] = False
arr = []
visited = [False for _ in range(N+1)]
results = []
back()
for result in results:
print(*result)
'알고리즘 > 백준' 카테고리의 다른 글
| [BOJ#10844] 쉬운 계단 수(Python) (2) | 2025.03.14 |
|---|---|
| [BOJ #1010] 다리놓기(Python) (0) | 2025.03.13 |
| [BOJ#9996] 한국이 그리울 땐 서버에 접속하지 (NodeJS) (6) | 2024.12.23 |
| [BOJ#25757] 임스와 함께하는 미니게임(NodeJS) (0) | 2024.07.18 |
| [BOJ#9655] 돌 게임(Python) (0) | 2024.07.14 |