Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- c언어 기본
- git기초
- 자료구조
- 운체 1주차
- c언어
- c언어 제어문
- 최단거리
- git 오류
- python자료형
- 스택
- git오류
- 5장
- 도커
- 백준
- 코테
- 파이썬 알고리즘 인터뷰
- 데베시 1주차
- python기초
- python기본
- Git
- 참고X
- 그리디
- 인텔리제이
- 4장
- Workbench
- 1주차(1)
- #코린이 #코딩 #할 수 있다
- DP
- 코딩테스트
- 인스타
Archives
- Today
- Total
하루살이 개발자
[BaekJoon 15649번] N과 M(1) (Python) 본문
N과 M(1) 문제입니다.
문제링크: https://www.acmicpc.net/problem/15649
15649번: N과 M (1)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
풀이
순열에 관한 문제로 nPm을 구하면 된다.
파이썬에 순열 함수를 제공하는 라이브러리가 있지만 n과 m문제는 백트래킹의 대표적인 문제로 백트래킹으로 풀었다.
중복 없이 m개의 수를 뽑아야 하므로 visited 배열을 만들어 이미 방문한 숫자면, 부모노드로 돌아가게 했다.
Code
n, m = map(int, input().split())
visited = [False] * n # 방문 체크
result = [] # 출력
def solve(depth):
if depth == m: # 탈출 조건
print(' '.join(map(str, result)))
return
for i in range(len(visited)):
if not visited[i]: # 방문 안했으면(False)
visited[i] = True # 방문 체크(중복 제거)
result.append(i+1) # 방문한 번호 입력
#print("result1:", result)
solve(depth+1) # 깊이 우선 탐색
#print("v1:",visited)
visited[i] = False # 깊이 방문 완료
result.pop() # 방문 내용 제거
#print("result2:", result)
#print("v2:", visited)
#print("=======================")
solve(0)
* 참고
입력
4 2
주석 제거 후 출력
result1: [1]
result1: [1, 2]
1 2
v1: [True, True, False, False]
result2: [1]
v2: [True, False, False, False]
=======================
result1: [1, 3]
1 3
v1: [True, False, True, False]
result2: [1]
v2: [True, False, False, False]
=======================
result1: [1, 4]
1 4
v1: [True, False, False, True]
result2: [1]
v2: [True, False, False, False]
=======================
v1: [True, False, False, False]
result2: []
v2: [False, False, False, False]
=======================
result1: [2]
result1: [2, 1]
2 1
v1: [True, True, False, False]
result2: [2]
v2: [False, True, False, False]
=======================
result1: [2, 3]
2 3
v1: [False, True, True, False]
result2: [2]
v2: [False, True, False, False]
=======================
result1: [2, 4]
2 4
v1: [False, True, False, True]
result2: [2]
v2: [False, True, False, False]
=======================
v1: [False, True, False, False]
result2: []
v2: [False, False, False, False]
=======================
result1: [3]
result1: [3, 1]
3 1
v1: [True, False, True, False]
result2: [3]
v2: [False, False, True, False]
=======================
result1: [3, 2]
3 2
v1: [False, True, True, False]
result2: [3]
v2: [False, False, True, False]
=======================
result1: [3, 4]
3 4
v1: [False, False, True, True]
result2: [3]
v2: [False, False, True, False]
=======================
v1: [False, False, True, False]
result2: []
v2: [False, False, False, False]
=======================
result1: [4]
result1: [4, 1]
4 1
v1: [True, False, False, True]
result2: [4]
v2: [False, False, False, True]
=======================
result1: [4, 2]
4 2
v1: [False, True, False, True]
result2: [4]
v2: [False, False, False, True]
=======================
result1: [4, 3]
4 3
v1: [False, False, True, True]
result2: [4]
v2: [False, False, False, True]
=======================
v1: [False, False, False, True]
result2: []
v2: [False, False, False, False]
=======================
*Code2
n, m = map(int, input().split())
visited = [False] * (n+1) # 방문 체크
result = [0] * (m+1) # 출력
def solve(depth):
if depth == m+1: # 탈출 조건
for i in range(1, m+1):
print(result[i], end=' ')
print()
else:
for i in range(1, n+1):
if not visited[i]: # 방문 안했으면(False)
visited[i] = True # 방문 체크(중복 제거)
result[depth] = i # 방문한 번호 입력
solve(depth+1) # 깊이 우선 탐색
visited[i] = False # 깊이 방문 완료
result[depth] = 0 # 방문 내용 제거
solve(1)
'코딩테스트' 카테고리의 다른 글
[프로그래머스] Level1 - 신고결과 받기(Java) (0) | 2022.08.05 |
---|---|
[BaekJoon 15650번] N과 M(2) (Python) (0) | 2022.03.01 |
[BaekJoon 20437번] 문자열 게임2(Python) (0) | 2022.02.24 |
[BaekJoon 16398번] 행성 연결 문제(Python) (0) | 2022.02.23 |
[BaekJoon 1647번] 도시 분할 계획 문제(Python) (0) | 2022.02.23 |