일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- node
- 싸이월드
- react native typescript navigation
- react-native
- stencil buffer
- javascript
- GitHub
- 리액트 네이티브 설치 오류
- c++ 정보은닉
- 스탠실 버퍼 사용
- react native typescript navigate
- react native typescript
- react native 타입스크립트
- C++
- 스탠실 버퍼 튜토리얼
- Expo
- react native accessible
- react native mac
- node.js
- html
- react
- 스탠실 버퍼 시작
- c++ using
- CSS
- react native
- cyworld
- 벡터와 리스트의 차이
- unity stencil buffer
- 리액트 네이티브 맥
- react native ios 기기 연결
Archives
- Today
- Total
혀니의 이거저거 뿌시기
백준 15650 N과 M(2) - 백트래킹문제 본문
728x90
15650번: N과 M (2) (acmicpc.net)
15650번: N과 M (2)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
N과 M문제와 매우 비슷 but 오름차순만 정렬해야된다는 것이 달랐음.
N,M = map(int, input().split())
lst = []
visited = [False] * N
def dfs(depth):
if depth == M:
print(' '.join(map(str, lst)))
return
for i in range(N):
if not visited[i]:
for j in range(i+1):
visited[j] = True
lst.append(i + 1)
dfs(depth + 1)
for j in range(i+1):
visited[j] = False
lst.pop()
dfs(0)
나의 아이디어: 기존것을 다 True로 만들면... 더이상 그쪽은 가지 않으니까 오름차순 정렬할것이다.
결과: 맞긴 함.. 그런데 뭔가 더 효율적인 방법이 있을듯
n,m = list(map(int,input().split()))
s = []
def dfs(start):
if len(s)==m:
print(' '.join(map(str,s)))
return
for i in range(start,n+1):
if i not in s:
s.append(i)
dfs(i+1)
s.pop()
dfs(1)
결론은 요렇게! 원래는 매 반복문마다 for i in range(N+1) 요랬다면 이번엔 걍 지금의 depth부터 참조를 시작하면 알아서 거기부터 판단하기 시작함.
그러므로 for i in range(start, n+1)이런식으로 됨
간단하네... 새로운걸알았다.
역시 백트래킹 같은 알고리즘은 걍 하면 할수록 깨닫는군.....
아직은 진짜 기본문제지만 점차 익혀가자
728x90
'알고리즘 공부(C++)' 카테고리의 다른 글
백준 1715 카드 정렬하기 - 힙 (0) | 2022.08.28 |
---|---|
백준 11279 최대 힙 (0) | 2022.08.28 |
백준 3986 좋은 단어 (0) | 2022.08.27 |
백준 18258 큐2 (0) | 2022.08.27 |
백준 1541 잃어버린 괄호 (0) | 2022.08.27 |