7 1 2 3 4 5 6 7
8 1 2 3 5 8 13 21 34
0
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7
1 2 3 5 8 13
1 2 3 5 8 21
1 2 3 5 8 34
1 2 3 5 13 21
1 2 3 5 13 34
1 2 3 5 21 34
1 2 3 8 13 21
1 2 3 8 13 34
1 2 3 8 21 34
1 2 3 13 21 34
1 2 5 8 13 21
1 2 5 8 13 34
1 2 5 8 21 34
1 2 5 13 21 34
1 2 8 13 21 34
1 3 5 8 13 21
1 3 5 8 13 34
1 3 5 8 21 34
1 3 5 13 21 34
1 3 8 13 21 34
1 5 8 13 21 34
2 3 5 8 13 21
2 3 5 8 13 34
2 3 5 8 21 34
2 3 5 13 21 34
2 3 8 13 21 34
2 5 8 13 21 34
3 5 8 13 21 34
이 문제는 조합 문제이다. 입력으로 주어지는 k 개수의 원소중에서 6개를 뽑아서 출력한다. 이전 글에서 조합 로직에 대해서 다뤘는데 그 재귀함수를 이용하면 쉽게 풀 수 있다. 다만 건강이슈로 오랜만에 공부를 다시 시작해서 문법적인 것에서 막히긴 했다.
# 값의 갯수 k, 값의 원소 배열 lst
k = value[0]
lst = []
for i in range(k):
lst[i] = value[i+1]
이게 인덱스 오류가 나는 이유는 lst를 빈리스트로 선언을 했기 때문이다. lst가 k만큼의 크기를 미리 가지고 있었으면 값을 넣어도 오류가 안났을 거다. 리스트에 원래 크기 이상의 공간에 값을 넣을때는 파이썬에선 append를 사용해야 한다. c는 미리 배열을 선언할때 큰 값으로 선언을 한다. c에서는 고려하지 않아도 되는 것이 파이썬을 할때는 고려를 해야해서 불편한 점도 있다.
# 백준 6603번 로또 (집합 유형문제)
def combination(index, level):
global choose, k, lst
if level == 6:
print(" ".join(map(str, choose)))
return
for i in range(index, k):
choose.append(lst[i]) # 현재 인덱스 자리 값을 배열에 추가
combination(i+1, level+1) # 위에서 배열에 값을 넣었고, if 문으로 걸러지기면서 6 조합을 계속 만든다
choose.pop() # 넣었던 값을 빼준다
while True:
value = list(map(int, input().split())) # 입력 받기
# 값의 갯수 k, 값의 원소 배열 lst
k = value[0]
lst = value[1:]
# k == 0이면 종료
if k == 0:
break
# 배열 choose선언 = global을 써야함함
choose = []
combination(0, 0) # index, level
print() # 공백