일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 최소공배수
- expo
- 1182
- 순열
- 11054
- 9095
- 매일11시
- lcm
- 6603
- Python
- LCS
- itertools
- 1260
- 앱
- Combination
- 11053
- 안드로이드
- Kotlin
- 코테
- 파이썬
- 11기
- 나머지
- 홈화면
- permutation
- Android
- 11057
- 백준
- 괄호
- 뒤로가기
- 코틀린
Archives
- Today
- Total
황소개발자
python permutations combinations 파이썬 순열 조합 itertools 모듈 사용. 사용법 정리. 문제점과 한계. 그리고 해결책 본문
백준 문제 풀이
python permutations combinations 파이썬 순열 조합 itertools 모듈 사용. 사용법 정리. 문제점과 한계. 그리고 해결책
hjp845 2020. 4. 22. 21:29반응형
입력이 들어오는 방식은 두가지
1. 문자열
import itertools
a = '1234'
print(list(map(''.join, itertools.permutations(a))))
['1234', '1243', '1324', '1342', '1423', '1432', '2134', '2143', '2314', '2341', '2413', '2431', '3124', '3142', '3214', '3241', '3412', '3421', '4123', '4132', '4213', '4231', '4312', '4321']
2. 숫자 배열 (문자 배열은 그냥 map(str, a) 없이 해주면 됨)
import itertools
a = [1, 2, 3, 4]
print(list(itertools.permutations(a)))
print(list(map(''.join, itertools.permutations(map(str, a)))))
[(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)]
['1234', '1243', '1324', '1342', '1423', '1432', '2134', '2143', '2314', '2341', '2413', '2431', '3124', '3142', '3214', '3241', '3412', '3421', '4123', '4132', '4213', '4231', '4312', '4321']
뭐 좋다.
근데 문제점이 있다.
import itertools
a = '111'
print(list(map(''.join, itertools.permutations(a))))
['111', '111', '111', '111', '111', '111']
...? 우리는 이런 결과를 원하는가? 메모리, 시간 다 비효율적이다.
combinations 도 마찬가지
import itertools
a = '111'
print(list(map(''.join, itertools.combinations(a, 2))))
['11', '11', '11']
음.. 쉣..
이게 한계다.
이 비효율은 직접 구현해서 해결해야한다..
처음 수를 딱 정해주고, 아래 글에서 next_permutation 을 계속 돌려서 경우의 수를 따져주면 된다.
.
.
그리고 가끔 문제를 풀다가
5개의 자리에서 두개의 자리를 골라줘야 되는 조합문제가 있는데
나는 처음엔
00011 이렇게 정하고, 위 글에서 next_permutation 써서 경우의 수를 따져줬다.
그런데
그냥 01234 주고 combinations(a, 2) 돌리는게 더 간단하네.
import itertools
a = '01234'
print(list(map(''.join, itertools.combinations(a, 2))))
['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
ㅇㅁㅇ..
그럼 모두 화이팅해라
반응형
'백준 문제 풀이' 카테고리의 다른 글
백준 17088 파이썬 python : 등차수열 변환 @@황소처럼 우직하게@@ 졸려뒤지것네 (0) | 2020.04.23 |
---|---|
백준 16637 파이썬 python : 괄호 추가하기 @@황소처럼 우직하게@@ 요샌풀면 "이게 되네" (0) | 2020.04.22 |
백준 16943 파이썬 python : 숫자 재배치 @@황소처럼 우직하게@@ permutations 사용해부려 (0) | 2020.04.22 |
백준 16938 파이썬 python : 캠프 준비 @@황소처럼 우직하게@@ 캠프가고 싶다 ㅠㅠ (0) | 2020.04.22 |
백준 16937 파이썬 python : 두 스티커 @@황소처럼 우직하게@@ 갓포스트말론 (0) | 2020.04.22 |
Comments