문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
![](https://blog.kakaocdn.net/dn/uFZj0/btsI3Z40jzY/jsvszAZ8lVKwKcvBSodFDK/img.png)
[풀이]
N과 M (1) 에서는 순열이었고, 이 문제는 조합이다.
그래서 (2)에서는 N과 M (1) 코드에서 오름차순 후 같은 것을 제거하는 과정을 거쳐야 한다.
ex) N과 M (1)
입력이 아래와 같을 때
4 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
여기에서 오름차순으로
1 2
1 3
1 4
1 2
2 3
2 4
1 3
2 3
3 4
1 4
2 4
3 4
이렇게 바꾼 후
동일한 것을 제거해야 한다.
따라서 N과 M (1) 코드인
여기에서 result_li 리스트를 생성하여 result를 오름차순하여 추가했다.
result_li = [[1, 2], [1, 3], [1, 4], [1, 2], [2, 3], [2, 4], [1, 3], [2, 3], [3, 4], [1, 4], [2, 4], [3, 4]]는 이런 상태이다.
그리고 set( ) 함수로 중복을 제거하고 다시 리스트화하기 위해 set와 tuple 을 사용했다.
리스트의 요소가 리스트일 경우, 직접적으로 'set'을 사용할 수 없어서 리스트를 tuple로 변환한 후 중복을 제거할 수 있다.
이렇게 되면 4 2를 입력했을 때
[(2, 4), (1, 2), (3, 4), (1, 4), (2, 3), (1, 3)] 이렇게 출력이 나오기 때문에
result_li를 다시 오름차순하여 [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
결과를 출력하도록 했다.
map(str, j)는 각 튜플 j의 요소(ex. (1, 2))를 문자열로 변환하여 ["1", "2"]로 만든다.
그 후 " ".join(...)은 이 리스트를 "1 2"처럼 공백으로 연결된 문자열로 만들어준다.
[최종 코드]
'알고리즘 공부' 카테고리의 다른 글
데크(Deque) (0) | 2024.08.14 |
---|---|
[백준 15649] N과 M(1) python (0) | 2024.08.12 |
우선순위 큐 (0) | 2024.08.10 |
[백준 1476번] 날짜 계산 python (0) | 2024.08.09 |
[백준 14888번] 연산자 끼워넣기 python (0) | 2024.08.09 |