| 문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 M개를 고른 수열
- 같은 수를 여러 번 골라도 된다.
- 고른 수열은 비내림차순이어야 한다.
- 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
| 입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
| 출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.
정답 코드 (itertools 모듈 활용하기)
import sys
from itertools import product
input = sys.stdin.readline
class Solution:
def n_m_4(self):
n,m = map(int, input().split())
for a in product(range(1,n+1), repeat = m):
isOk = True
for i in range(m-1):
if a[i] > a[i+1]:
isOk = False
break
if isOk:
print(*a)
if __name__ == "__main__":
s = Solution()
s.n_m_4()
정답 코드 (백트래킹 활용하기)
import sys
input = sys.stdin.readline
class Solution:
def n_m_4(self):
n,m = map(int, input().split())
s = []
def dfs(k):
if len(s) == m:
print(*s)
return
for i in range(k,n+1):
s.append(i)
dfs(i)
s.pop()
dfs(1)
if __name__ == "__main__":
s = Solution()
s.n_m_4()
| 비고
위는 백트래킹으로 푼 시간, 아래는 itertools의 product로 푼 시간이다. 상당한 차이가 나는 것을 볼 수 있다. product를 사용하면 간단하지만, 문제에서 유도한 알고리즘도 백트래킹이기도 했고, 훨씬 더 성능이 좋아지는 것을 확인할 수 있었다.
'BAEKJOON' 카테고리의 다른 글
[Python/Silver2/1654] 랜선 자르기 (0) | 2025.01.28 |
---|---|
[Python/Bronze2/15829] Hashing (0) | 2025.01.27 |
[Python/Silver1/5525] IOIOI (0) | 2025.01.27 |
[Python/Silver3/2149] 암호 해독 (0) | 2025.01.27 |
[Python/Silver4/14584] 암호 해독 (1) | 2025.01.26 |