[백준] N과 M (1)(Python)

규갓 God Gyu·2024년 7월 24일

백준

목록 보기
20/96

문제

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

1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

출력

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

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

예제 입력 1

3 1

예제 출력 1

1
2
3

예제 입력 2

4 2

예제 출력 2

1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3

예제 입력 3

4 4

예제 출력 3

1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1

최종 코드

from itertools import permutations

# 자연수 N과 M
N, M = map(int, input().split())

# 숫자일땐 range만 해도 범위가 설정되어 바로 list에 담을 수 있음
numbers = list(range(1, N+1))

# N개의 숫자 중에서 M개를 중복 없이 고른 모든 순열을 생성
perms = permutations(numbers, M)

for perm in perms:
  result = ' '.join(map(str, perm))
  print(result)

몰랐던 부분

from itertools import permutations
itertools는 파이썬 표준 라이브러리로, 반복 가능한 객체들을 처리하는 다양한 유틸리티 함수 제공
permutations는 iterable의 모든 순열을 생성

perms = permutations(numbers, M)
itertools.permutations 함수 사용하여 numbers 리스트에서 길이 M의 모든 순열을 생성하는 부분

numbers가 [1, 2, 3, 4]이고 M이 2라면, 다음과 같은 순열을 생성

(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)

result = ' '.join(map(str, perm))

  • map(str, perm)
    map함수는 두 개의 인수를 받음. 첫 번째 인수는 함수(str), 두 번째 인수는 iterable(perm)
    map함수는 perm 의 각 요소에 대해 str 함수를 적용. 즉, 각 숫자를 문자열로 변환
  • ' '.join()
    ' ' 공백 문자열의 join메소드는 iterable의 각 요소를 공백을 구분자로 하여 하나의 문자열로 결합
    즉, ' ' << 공백 하나를 기준으로 띄워서 문자열로 풀어서 나타냄
    ex) ['1','2'] => 1 2
profile
웹 개발자 되고 시포용

0개의 댓글