백 트래킹의 기본이 재귀 함수를 호출하는 것이잖아요.
함수 호출 비용이 일단 엄청나게 들어갑니다.
복귀 포인터 저장하고요. (어딘가에 저장하겠죠?)
베이스 포인터도 바꿀 거고, 인자를 넘겨받으면서 스택 포인터도 증가시킬 거고..
1번 premutation이 돌 때마다 10번을 수행하겠네요?
10! x 10 = 3628만번. 여기에 연산 몇 번 하면 시간 초과가 나는 건 당연하겠죠..
단순히 시간을 줄이는 쉬운 방법은.
(1) 어짜피 문자열의 최대 길이가 10입니다.
(2) 10개 모두 다 다르다면 백트랙킹을 할 필요가 있을까요?
(3) 10개 중에서 일부만 같은 경우는 어짜피 걸러지기 때문에, 실제 수행 횟수는 얼마 되지 않습니다.
다만, 재귀 호출에 의한 것이 문제이지요. 계속 함수를 불렀다가. 스택 쌓았다가 팝 했다가.
최악의 경우에는, 2개만 같고, 나머지가 모두 다른 경우
그러니까 aabcdefghi 같은 경우인데, 이 경우, 함수 호출 횟수가 811만번이나 되네요.
물론 prem 자체는 그리 많지는 않아 보입니다만..
하지만, back - tracking을 하면서 부르는 함수 호출은 쉽게 개선되지 않죠.
https://www.nayuki.io/page/nex...
이 자료를 참고하시면 next_permutation을 구현하실 수는 있으실 겁니다.
물론 c++ 알고리즘에도 있고요.
2eesh 6년 전 2
dfs로 완전 다 찾는데
문자열의 길이가 8이상일때 시간이 오래걸리네요 ㅠ
어떻게 시간을 줄일수 있을까요 ???