Thief of Wealth
시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초512 MB84068954082.822%

문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.


앞버젼 N과 M(1) 이랑 다른 점은 출력해야할 순열이

오름차순으로 이루어져 있어야 한다는 것이다.

1 2 3 4 는  되나 1 2 4 3은 안되는식.


이전 글 N과M(1) 을 응용하여 이 문제를 풀어보자.

import sys
import math
sys.stdin = open("input.txt","r",encoding="utf-16")

n,m = map(int, input().split())

answer = []
for i in range(m):
answer.append("")

def cal_perm(deepness):
if deepness == m:
print( str(answer)[1:-1].replace(",","") )
else:
for i in range(1,n+1,1):
if i not in answer:
answer[deepness] = i
cal_perm(deepness+1)
answer[deepness] = -1

cal_perm(0)


위 코드를

맨 앞 인덱스 값 빼고 다른 인덱스 값들은 모두 이전 인덱스 값과 비교하여 클때만 진행하도록 조건문을 짜준다.

import sys
import math
sys.stdin = open("input.txt","r",encoding="utf-16")

n,m = map(int, input().split())

answer = []
for i in range(m):
answer.append("")

def cal_perm(deepness):
if deepness == m:
print( str(answer)[1:-1].replace(",","") )
else:
for i in range(1,n+1,1):
if i not in answer: # over lap condition
if deepness != 0: # Acending condition
if answer[deepness-1] < i:
answer[deepness] = i
cal_perm(deepness+1)
answer[deepness] = -1
else:
answer[deepness] = i
cal_perm(deepness+1)
answer[deepness] = -1

cal_perm(0)


'개발 > 알고리즘' 카테고리의 다른 글

15652 N과 M(4)  (0) 2019.01.05
15651 N과 M(3) 중복순열  (0) 2019.01.05
15649 N과 M(1)  (0) 2019.01.05
11365 !terces poT (문자열 뒤집기)  (0) 2019.01.04
1476 날짜계산  (0) 2019.01.04
profile on loading

Loading...