15649 : N과 M (1)

네르기·2021년 8월 27일
0

알고리즘

목록 보기
29/76

어떤 문제인가?

백트래킹을 쓰는 문제.

이게 도대체 뭔...

처음 문제를 풀 때, 뭔지 모르겠는 부분이 있었다.

  • 백트래킹 예제들을 보니까 DFS를 쓰고, 이 DFS는 트리 또는 그래프 탐색에 근간한 개념이다. 근데 예제에서는 그래프랑 트리를 직접 쓴다는 가정하에 설명된 게 많은데, 문제에서 제시하는 건 배열 뿐이다. 어떻게 하란건가?
  • 설령 배열을 트리 혹은 그래프로 온전히 옮겼다 하더라도, 수열에 있는 값들은 여러 번 나오는데, 이들을 구분할 유일한 값은 어떻게 부여해야 하는가?

DFS 개념도 보고, 백트래킹도 보고 했지만 도저히 감을 못 잡았다. 그래서 답을 봤다. 하루종일 잡아도 못풀 것 같다는 생각이 들었다.

음... 그런 개념이

우선 내 코드는 아니다. 남들의 코드를 먼저 인용하겠다.

#include <stdio.h>

int r[8], n, m, v[9];

void recur(int k) {
	int i;
	if (k == m) {
		for (i = 0 ; i < m ; i++) printf("%d ", r[i]);
		printf("\n");
		return;
	}
	for (i = 1 ; i <= n ; i++) {
		if (!v[i]) {
			v[i] = 1, r[k] = i;
			recur(k + 1);
			v[i] = 0;
		}
	}
}

int main() {
	scanf("%d%d", &n, &m);
	recur(0);
}

goooora님의 코드
-> https://www.acmicpc.net/source/8974737

백트래킹은 일반적인 DFS에 2가지가 추가된다.

  • 조건문
  • 원래 상태로 되돌리는 구문
    2번째가 가장 중요하다. 위의 코드에서 v[i]=0으로 된 부분이 바로 그 부분이다.

이 부분은 나중에 따로 시간을 할애해 알고리즘-개념 시리즈에 올려둘 예정이다. 이 문제 푸는 방법 찾는다고 난리를 친 반동때문인지 며칠간 이 문제에 대한 풀이 후기를 작성할 생각을 접어뒀었다. 이제라도 써서 다행이다.

참고한 게시글

profile
프로그래머와 애니메이터가 되고파

0개의 댓글