본문 바로가기
JAVA/Coding Test Study

[Lv.2] 하노이의 탑 : Java

by ♡˖GYURI˖♡ 2024. 3. 19.
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

이해하기

강의에서도 분명 들었던 하노이의 탑 문제...!

보자마자 아 나 이거 아는데 분명 풀었는데 싶었지만... 역시나 못 풀었죠?

 

유일하게 떠올랐던 건 하노이의 탑 규칙 중에 n이 짝수면 첫 move를 2로 하고, n이 홀수면 첫 move를 3으로 한다는 점...

 

이번에 참고한 글은 바로 요 블로그!

 

[재귀] java 코드로 하노이 탑 쉽게 이해해보자! by.펜잡이 개발자

데브림의 블로그 포스팅 한 것들을 한 눈에 확인하고 싶다면 클릭! 👉 https://github.com/DevLimK1/tistory-map 👈 🤔포스팅을 통해 얻어갈 수 있는 지식🧐 ✔ 재귀에 대해 이해를 할 수 있다. ✔ 하노이

devlimk1.tistory.com

예시까지 들어가며 자세히 설명해주셔서 이해하는데 도움이 되었다!

하지만 흐름을 이해한 후 그걸 가지고 로직을 만드는게 너무 어려운 것 같다ㅜ

 

 

문제풀이

import java.util.*;

class Solution {
    List<int[]> arr = new ArrayList<>();

    public int[][] solution(int n) {
        hanoi(n, 1, 2, 3);
        int[][] answer = arr.stream().toArray(int[][]::new);
        return answer;
    }

    public void hanoi(int cnt, int start, int mid, int end) {
        if (cnt == 0) {
            return;
        }
        
        hanoi(cnt - 1, start, end, mid);
        arr.add(new int[]{start, end});
        hanoi(cnt - 1, mid, start, end);
    }
}

 

일단 결과를 저장할 List를 선언한다.

stream을 사용하여 바로 int 배열로 만드는 방법을 처음 알게 되었다.

그동안은 for문을 돌며 하나씩 저장해줬는데 더 쉬운 방법이 있었다니, 코드를 줄이는데 도움이 될 것 같다!

 

2층짜리 hanoi 탑을 가지고 hanoi 함수에 적용해보면 다음과 같다.

 

1. hanoi(2, 1, 2, 3)

cnt = 2, start = 1, mid = 2, end = 3

 

위 블로그에서 이 부분은 아직은 움직임이 없기에 'start에서 end로 옮길 것이다.' 라는 식으로만 이해하고 넘어가라고 하셨다. 그렇게 이해하니 좀 더 쉬워보이는...

 

2. if (cnt == 0) 

false라서 다음으로 넘어간다.

 

3. hanoi(1, 1, 3, 2)

cnt = 1, start = 1, mid = 3, end = 2

 

이 부분처럼 재귀로 들어갈 때 start, mid, end의 값이 바뀌는 것이 어렵게 느껴졌다. (체크!)

 

4. if (cnt == 0)

false라서 다음으로 넘어간다.

 

5. hanoi(0, 1, 2, 3)

cnt = 0, start = 1, mid = 2, end = 3

 

6. if (cnt == 0)

return! 3번 이후로 되돌아간다.

 

7. arr.add(new int[]{start, end})

3번에서 start = 1, end = 2이기에 arr에 {1, 2}가 저장된다.

 

8. hanoi(0, 3, 1, 2)

 

9. if (cnt == 0)

return! 2번 이후로 되돌아간다.

 

10. arr.add(new int[]{start, end})

1번에서 start = 1, end = 3이기에 arr에 {1, 3}이 저장된다.

 

11. hanoi(1, 2, 1, 3)

cnt = 1, start = 2, mid = 1, end = 3

 

12. if (cnt == 0)

false라서 다음으로 넘어간다.

 

13. hanoi(0, 2, 3, 1)

 

14. if (cnt == 0)

return! 11번 이후로 되돌아간다.

 

15. arr.add(new int[]{start, end})

11번에서 start = 2, end = 3이기에 arr에 {2, 3}이 저장된다.

 

16. hanoi(0, 1, 2, 3)

 

17. if (cnt == 0)

return! 16번 이후로 되돌아가기에 여기서 끝나게 된다.

 

결과적으로 arr에는 {{1, 2}, {1, 3}, {2, 3}}이 저장된다.

 

 

하노이의 탑은 자주 나오지만 항상 로직 짜는 것이 어려운 것 같다.

자주 나오는만큼 아예 외워버리는 것이 답일수도 있겠다는 생각이 든다 ㅎ...

'JAVA > Coding Test Study' 카테고리의 다른 글

[Lv.2] 게임 맵 최단거리 : Java  (0) 2024.03.20
[Lv.2] 피보나치 수 : Java  (0) 2024.03.20
[Lv.2] 모음사전 : Java  (0) 2024.03.19
[Lv.1] 대충 만든 자판 : Java  (0) 2024.03.04
[Leet Code] Group Anagrams : Java  (0) 2024.03.04