알고리즘/백준(BOJ)

[백준/BOJ/알고리즘/파이썬(python)]#15649,#15650,#15651,#15652_N과M(1)(2)(3)(4)[순열/조합]

https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

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

www.acmicpc.net

 

https://www.acmicpc.net/problem/15650

 

15650번: N과 M (2)

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

www.acmicpc.net

https://www.acmicpc.net/problem/15651

 

15651번: N과 M (3)

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

www.acmicpc.net

https://www.acmicpc.net/problem/15652

 

15652번: N과 M (4)

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

www.acmicpc.net

N과M(1)문제는 이전 포스트에서 다루었다.

https://hidemasa.tistory.com/96

 

[백준/BOJ/알고리즘/파이썬(python)/C++/백트래킹]#15649_N과M(1)

https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

hidemasa.tistory.com

N과 M(1)에서는 permutations()함수를 사용했었다.

N과 M(1)과 다르게 오름차순이어야 하므로 순서 상관없이 조합하는 combinations()를 사용한다.

import sys
from itertools import combinations
input = sys.stdin.readline

N,M = map(int, input().split())


C = combinations([str(i) for i in range(1, N+1)], M)


print('\n'.join(map(" ".join,C)))

같은 수를 여러번 골라도 되므로 중복 순열을 고르는 문제다. product()함수를 사용한다.

#15651 N과M(3)
import sys
from itertools import product
input = sys.stdin.readline

N,M = map(int, input().split())


P = product([str(i) for i in range(1, N+1)], repeat=M)

for num in P:
    print(' '.join(map(str,num)))

(3)과 다르게 비내림차순이어야 하므로 순서를 상관 안 하는 중복조합문제다. 

#15652 N과M(4)
import sys
from itertools import combinations_with_replacement
input = sys.stdin.readline

N, M =map(int, input().split())

C = combinations_with_replacement([i for i in range(1, N+1)], M)

for num in C:
    print(' '.join(map(str,num)))

 

 

순열조합 문제는 파이썬이 다른 언어에 비해서 itertools 라이브러리가 상당히 사기(?)다. 

코딩테스트 준비할때도 순열조합 문제가 나온 경우에는 파이썬으로 푸는 등 요령을 쓰는 게 좋을 듯 싶다.