[Algospot] PICNIC - 재귀 호출
풀이
'알고리즘 문제 해결전략' 책의 풀이를 공부했다.
완전 탐색을 재귀 함수로 구현하여 풀이한다.
입력받은 친구관계는 2차원 리스트 areFriends에 bool 형태로 관리한다.
완전 탐색을 하면서 짝이 되는 한 쌍을 찾은 경우, taken bool 리스트에 이를 표시하고, 전체에서 짝이 된 2명을 제외한 나머지 학생들에 대해 재귀함수를 호출하여 더이상 남은 학생이 없는 경우 = 모든 짝을 찾은 경우 로 재귀를 마치게 된다.
코드
import sys sys.setrecursionlimit(10**8) C = int(input()) #test case 수 def countPairings(taken = [False]*10): firstFree = -1 for i in range(n): if not taken[i]: firstFree = i break if firstFree == -1: return 1 #모든 학생이 짝을 찾은 경우 프로그램 종료 ret = 0 for pairWith in range(firstFree+1, n): if not taken[pairWith] and areFriends[firstFree][pairWith]: taken[firstFree] = taken[pairWith] = True ret += countPairings(taken) taken[firstFree] = taken[pairWith] = False return ret for _ in range(C): n,m = map(int, input().split()) #학생 수 , 친구 쌍의 수 areFriends = [[False]*10 for _ in range(10)] #학생 수 최대 10 temp = list(map(int, input().split())) idx = 0 for _ in range(m): a,b = temp[idx], temp[idx+1] areFriends[a][b] = True areFriends[b][a] =True idx+=2 print(countPairings()) | cs |
No comments: