반응형
문제조건
k개 수 중에 6개를 고른다. (조합)
핵심개념
- 파이썬 itertools.combinations 라이브러리를 사용하거나
- 재귀함수를 이용하거나
- next_permutations 함수를 구현하여 사용하는 방법이 있다.
코드
(1) 파이썬 itertools.combinations 라이브러리 사용하는 방법
from itertools import combinations
while True:
num = list(map(int, input().split()))
if num[0] == 0:
break
#입력받은 수에서 (맨 왼쪽 제외) 6개를 선택하는 경우
for i in combinations(num[1:], 6):
print(' '.join(map(str, i)))
print()
(2) 재귀함수 사용하는 방법
lotto = [0] * 6
def go(idx, start, n, m):
if idx == 6:
print(' '.join(map(str, lotto)))
return
for i in range(start, len(n)):
lotto[idx] = n[i]
go(idx + 1, i + 1, n, m)
while True:
num = list(map(int, input().split()))
if num[0] == 0:
break
go(0, 0, num[1:], 6)
print()
(3) next_permutations 함수를 구현하여 사용하는 방법
def next_permutations(a):
# i 찾기
i = len(a) - 1
while i > 0 and a[i - 1] >= a[i]:
i -= 1
# 마지막 순열인 경우 return 하기 (내림차순)
if i == 0:
return False
# j 찾기
j = len(a) - 1
while i - 1 < j and a[i - 1] >= a[j]:
j -= 1
# 바꾸기
a[i - 1], a[j] = a[j], a[i - 1]
# 내림차순으로 정렬하기
j = len(a) - 1
while i < j:
a[i], a[j] = a[j], a[i]
i += 1
j -= 1
return True
while True:
num = list(map(int, input().split()))
if num.pop(0) == 0:
break
# 0은 로또로 뽑히는 경우, 1은 로또로 안 뽑히는 경우
arr = [0] * 6 + [1] * (len(num) - 6)
print(' '.join(map(str, num[0:6])))
while next_permutations(arr):
for i in range(len(num)):
if arr[i] == 0:
print(num[i], end=' ')
print()
print()
반응형
'프로그래밍 > 알고리즘 문제' 카테고리의 다른 글
[BOJ 2667 - 단지번호붙이기] BFS (Python) (4) | 2019.10.03 |
---|---|
[B0J - 14888 연산자 끼워넣기(2)] 브루트포스(순열) python (4) | 2019.09.29 |
[BOJ 15658] 연산자 끼워넣기(2) - python (4) | 2019.09.24 |
[프로그래머스] kakao 2018 코딩테스트 - 후보키 (python) (4) | 2019.09.04 |
[프로그래머스] kakao 2018 코딩테스트 - 오픈채팅방 (python) (4) | 2019.09.03 |
댓글