일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- ML
- dfs
- 프로그래머스
- 코딩테스트
- 코테
- 1일1솔
- 재귀함수
- 완전탐색
- 알고리즘
- sort
- 정렬
- python3
- 백준
- Python
- two pointer
- Virtual Memory
- Loss
- 머신러닝
- CS
- 백트래킹
- Algorithm
- Github
- 브루트포스
- 재귀
- 신나는함수실행
- 파이썬
- BF
- backtracking
- OS
- 투포인터
Archives
- Today
- Total
이것저것 공부 기록하기
[Algorithm] 1일1솔 - 백준 15651 N과 M (3) (python3) 본문
문제링크
https://www.acmicpc.net/problem/15651
문제설명
앞서 풀이했던 15649번: N과 M(1), 15650번: N과 M(2) 문제와 유사하며, 문제의 조건이 약간 변형되었다.
'같은 수를 여러 번 골라도 된다' 는 조건이 추가되었다. 이 조건으로 인해 해당 문제는 백트래킹으로 풀이하면 pruning 과정이 따로 필요없이 dfs로 경우의 수를 탐색해주면 된다.
또한, 경우의 수로 풀이하는 경우에는 중복순열을 이용해서 풀 수 있다.
문제풀이
1. 중복 순열
순서가 달라지면 다른 수열로 인정하며, 같은 수를 여러 번 골라도 된다는 조건이 있으므로 중복 순열임을 알 수 있다.
itertools의 product 를 활용하여 풀었다. 시간은 백트래킹 알고리즘으로 채점했을 때보다 덜 소요되었다.
import sys
from itertools import product
n, m = map(int, sys.stdin.readline().split())
prod = product(range(1,n+1),repeat=m)
for x in comb:
print(*x)
2. 백트래킹
stack에 자연수 i를 추가해준 후, 탐색 작업(dfs)이 끝난 후에는 다시 stack에서 제거(pop)하는 작업을 반복 수행했다.
중복도 허용하고, 순서가 달라지면 다른 수열로 인정하기 때문에 숫자의 중복이나, 순서의 중복에 대한 pruning 작업은 따로 필요없다.
M만큼의 길이의 수열마다 출력을 해야하므로 탈출 조건은 스택의 길이가 M이 될 때로 설정했다.
import sys
n, m = map(int, sys.stdin.readline().split())
ret = []
def dfs():
if len(ret) == m:
print(*ret)
return
for i in range(1, n+1):
ret.append(i)
dfs()
ret.pop()
dfs()
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[Algorithm] 1일1솔 - 백준 14888 연산자 끼워넣기(python3) (0) | 2022.01.20 |
---|---|
[Algorithm] 1일1솔 - 백준 15652 N과 M (4) (python3) (0) | 2022.01.17 |
[Algorithm] 1일1솔 - 백준 15650 N과 M (2) (python3) (0) | 2022.01.13 |
[Algorithm] 1일1솔 - 백준 15649 N과 M (1) (python3) (0) | 2022.01.12 |
[Algorithm] 1일1솔 - 백준 1427 소트인사이드 (python3) (0) | 2022.01.11 |
Comments