Algorithm

Baekjoon 백준 알고리즘 - N과 M ( 15649 )

jssvs 2022. 1. 16. 20:57
반응형

1. 문제 소개

  • 백트래킹 알고리즘 유형 문제에 해당한다.

 

https://www.acmicpc.net/problem/15649

2. 코드

STACK = []
VISIT = []
N,M=0,0

def input_test_case():
	input_str= input().split(" ")
	N,M = int(input_str[0]),int(input_str[1])

	return N,M
# N 4,2  / 1,2,3,4 
def combinations(NUM,CNT):
	global VISIT,STACK,N,M
	if CNT==M:
		parsed_stack = map(lambda x: str(x),STACK)
		print(" ".join(parsed_stack))
		
		return 0

	for i in range(1,N+1):
		if NUM == i or VISIT[(i-1)]:
			continue

		STACK.append(i)
		VISIT[i-1]=True
		combinations(i,CNT+1)
		STACK.pop()
		VISIT[(i-1)]=False

def solution():
	global VISIT,STACK,N,M 
	N,M=input_test_case()
	
	VISIT = [False]* N
	combinations(0, 0)
	#print(f'N :{N} \t M : {M}')
	
def main():
	solution()
	

main()

3. 코멘트

  • 백트래킹 쉽게 요약하면 탐색과정에 더 이상의 해가 없는 경우를 IF 조건으로 만들어 다음 탐색으로 넘어가는 알고리즘이다.
  • combinations()에서 DFS 로 탐색을하고, 백트래킹 탈출 조건을 수열의 길이가 M 일때로 잡고, 정답을 출력하도록 했다.
반응형