문제풀이/백준
백준 6603 로또 문제풀이
soo-dal
2024. 1. 3. 10:54
문제 소개
https://www.acmicpc.net/problem/6603
6603번: 로또
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로
www.acmicpc.net
문제 접근 방식
s 집합에서 6개의 숫자를 골라서 모든 경우를 만드는 문제이며 완전탐색 문제임을 알 수 있다.
조합 라이브러리를 써도 되며, 재귀함수를 사용해서 풀어도 되는데 재귀 연습을 위해 후자의 방법을 사용해서 구현했다.
코드
import sys
input=sys.stdin.readline
print=sys.stdout.write
def dfs(current, count):
# 선택한 숫자가 6개가 되었다면, 해당 경우의 수를 출력한다.
if count==6:
print(' '.join(map(str,selected))+'\n')
return
# s 그룹에서 현재 숫자 이후에 위치한 숫자들 중 하나를 뽑아서 dfs를 재귀호출한다.
for i in range(current+1,k):
if visited[i]==0:
selected.append(s[i])
visited[i]=1
dfs(i,count+1)
selected.pop(-1)
visited[i] = 0
if __name__=='__main__':
global k,s,selected, visited
while 1:
s=list(map(int,input().split()))
k=s.pop(0)
selected=[]
visited=[0]*len(s)
dfs(-1,0)
print('\n')
if k==0:
break
회고
이전 문제들에서는 파이썬 global 명령어를 사용하는 방법을 몰라서 매개변수로 설정해서 넘겨줬는데
이번에는 global 사용법에 대한 공부를 하며 문제를 풀었음.
global 명령어는 먼저 실행될 함수에서
global x
이런식으로 선언해주면 이후 진행되는 코드에서는 x 를 이용해서 사용할 수 있다.