2020/03/02 - [파이썬 코딩테스트/BAEK JOON] - [백준] 15649. N과 M (1) 파이썬
2020/03/02 - [파이썬 코딩테스트/BAEK JOON] - [백준] 15650 N과 M(2) 파이썬
* DFS 재귀방식을 이용한 파이썬 풀이입니다.
문제출처 |
[백준] 15651 N과 M(3) 파이썬
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
-
1부터 N까지 자연수 중에서 M개를 고른 수열
-
같은 수를 여러 번 골라도 된다.
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 7)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
<풀이>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 3번. [백준] 15651
# 1~n 중에 m 개 뽑기. 중복사용가능. 순서있음. [1,2],[2,1] 다르게 봄
n,m = map(int,input().split())
numbers = [i+1 for i in range(n)] # 1~n까지
is_number = [0 for _ in range(m)] # 출력 개수
#check = [False for _ in range(n)] # 사용여부 필요없음
def dfs(idx):
if idx >= m: # 0부터 m출력개수 되면
print(*is_number)
return
for i in range(n):
is_number[idx] = numbers[i]
dfs(idx+1)
dfs(0)
|
중복을 허용하므로, 사용여부를 체크할 필요가 없어짐
n,m = 4,2 일 때
문제출처 |
[백준] 15652 N과 M(4) 파이썬
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
-
1부터 N까지 자연수 중에서 M개를 고른 수열
-
같은 수를 여러 번 골라도 된다.
-
고른 수열은 비내림차순이어야 한다.
-
길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
-
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
<풀이>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 4번. [백준] 15652 (1)
# 1~n 중에 m 개 뽑기. 중복사용가능. 순서없음. [1,2]=[2,1] 같게 봄
n,m = map(int,input().split())
numbers = [i+1 for i in range(n)] # 1~n까지
is_number = [0 for _ in range(m)] # 출력 개수
#check = [False for _ in range(n)] # 사용여부 필요없음
def dfs(idx,next):
if idx >= m: # 0부터 m출력개수 되면
print(*is_number)
return
for i in range(next,n):
is_number[idx] = numbers[i]
dfs(idx+1,i) # 재귀포문에선 처음부터 아닌 나부터~
dfs(0,0)
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
뽑는건 중복을 허용하지만, 배치는 중복을 허용하지 않고, 오름차순으로 나와야 한다.
길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순
15651 N과 M(3) 에서 13번째 줄, dfs(idx+1,i) 만 변경 # 재귀포문에선 처음부터 아닌 나부터~
n,m = 4,2
<그냥 해본 연습>
어, 그럼 아까 삼번 문제는 결과값을 다 허용했는데 여기서는 같은 배치요소들이면 오름만 가능하니깐
8번째 줄의, 출력시 제한을 걸어볼까? 생각도 하긴했다. ㅋㅋㅋㅋ 쓸데없는 것도 다 돌면서 또 비교하는 ㅋㅋㅋ
문제 출제의도가 이건 아니겠지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 4번. [백준] 15652 (2)
# 1~n 중에 m 개 뽑기. 중복사용가능. 순서없음. [1,2]=[2,1] 같게 봄
n,m = map(int,input().split())
numbers = [i+1 for i in range(n)] # 1~n까지
is_number = [0 for _ in range(m)] # 출력 개수
#check = [False for _ in range(n)] # 사용여부 필요없음
def dfs(idx,next):
if idx >= m: # 0부터 m출력개수 되면
cnt = 1
for x in range(len(is_number)-1):
if is_number[x] > is_number[x]:
cnt = 0
if cnt:
print(*is_number)
return
for i in range(next,n):
is_number[idx] = numbers[i]
dfs(idx+1,next)
dfs(0,0)
|
'코딩테스트 \파이썬\자바 > BAEK JOON' 카테고리의 다른 글
[백준] 15656 N과 M(7) - 파이썬 DFS 재귀 (0) | 2020.03.14 |
---|---|
[백준] 15655 N과 M(6) 파이썬 (0) | 2020.03.08 |
[백준] 15654 N과 M(5) 파이썬 (0) | 2020.03.08 |
[백준] 15650 N과 M(2) 파이썬 (0) | 2020.03.02 |
[백준] 15649. N과 M (1) 파이썬 (0) | 2020.03.02 |