Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🔗 문제 링크
백준 | 하노이 탑
✔️ 소요된 시간
30분
✨ 수도 코드
1️⃣ 문제 선정 이유
DP를 도전하기 전에 먼저 재귀를 많이 풀면서 재귀적 사고를 키울려고 재귀 문제로 선택했습니다.
과거에 재귀를 처음 공부하다가 정말 힘들게 해결하고도 이해가 잘 안되었던 하노이 탑 이동 순서와 거의 똑같은 문제로 도전했습니다.
작년에 처음 하노이탑 도전했을 때는 혼자 짝수, 홀수 나누고... 뭐 풀면서 점점 산으로 갔었는데 이산수학 듣고 보니 재귀적 접근에 대한 시야가 달라진 느낌이네요.
2️⃣ 하노이탑 원판 이동 과정
하노이탑 해보기 링크
n개의 원판을 옮길때 반드시 거치는 과정
n-1개의 원판을 임시 기둥에 옮긴다.
현재 상황에서 가장 큰 원판을 목적지 기둥에 옮긴다.
n-1개의 원판을 목적지 기둥에 옮긴다.
따라서 하노이탑의 원판 이동횟수를 f(n)이라고 두면 점화식
f(n) = 1 + 2f(n-1)
으로 표현 할 수 있습니다.1 : 가장 큰 원판으로 목적지 기둥으로 옮기는 횟수
2f(n-1) : n-1개의 원판을 임시 기둥으로 옮겼다가, 목적지 기둥으로 옮기는 횟수
다들 이산수학 수강하셨으니 아실텐데 이 점화식을 풀게되면
f(0)=0
원판 n개에 대한 하노이탑 원판 이동 횟수를 구할 수 있습니다.
3️⃣ 코드 설명
첫번째 출력 전체 원판 이동횟수는 2의 n제곱 -1을출력
n <=20인 경우는 이동 과정까지 출력해주어야 하기 때문에 재귀함수 제작
원판 갯수 n과 기둥번호 from, temp, to로 매개변수 입력으로 받아줍니다.
탈출 조건 : n == 0이 될때 재귀함수 탈출
위에서 설명한 1번, 2번, 3번 과정에 맞게 재귀 함수의 매개변수를 적절히 바꿔서 호출합니다.
남은 1개의 원판을 목적지 기둥으로 옮기는 과정에서 실질적 이동이 발생하기 때문에 여기서 출발기둥, 목적기둥을 출력을 해줍니다.
이렇게 문제의 정의(원판 이동 과정)에 맞게 재귀함수를 만들어주면 컴퓨터가 알아서 깊게 들어가서 처리해줍니다!
📃 전체 코드
🙈트러블 슈팅
c++로 2의 n제곱 -1을 출력하는 과정에서 n의 최댓값이 100이었습니다..
2의 100제곱 - 1: 1,267,650,600,228,229,401,496,703,205,375
여기서 처음에는 long long 자료형으로 shift 연산을 사용해 2의 제곱을 나타냈는데 애초에 long long int로도 표현할 수 없더라구요..
그래서 계속 고민하다가 검색해서 이를 문자열로 표현하는 방법을 찾아냈습니다.
📚 새롭게 알게된 내용