코테/프로그래머스

[프로그래머스/Level2] 하노이의 탑 (JAVA)

imname1am 2024. 1. 24. 16:03
반응형

📖 문제

 

프로그래머스

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

programmers.co.kr

 

 

 

 

💡  풀이 방식

• 재귀

필요 자료구조
- (시작점, 도착점) 값 저장용 리스트 List<int[]> ⭐
- 정답 출력용 2차원 int형 배열 answer

 

. 재귀 함수를 활용해 하노이의 탑을 구현한다.

Hanoi(이동할 원판 갯수, 시작점, 경유지, 도착지)

 

 1) (n - 1)개의 원판을 1번째 > 2번째 기둥으로 옮긴다. ▷ Hanoi(n - 1, 1, 3, 2)

 2) 남은 1개 원판을     1번째 > 3번째 기둥으로 옮긴다. 

 3) (n - 1)개의 원판을 2번째 > 3번째 기둥으로 옮긴다. ▷ Hanoi(n - 1, 2, 1, 3)

 

 

 

💥 유의사항

정답 출력용 2차원 int형 배열의 크기는 [배열 저장용 리스트의 크기][2]여야 한다.

여기서 그냥 n을 넣으면 시간초과 에러가 발생한다.

 

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.*;
 
class Solution {
    static List<int[]> list = new ArrayList<>();
    
    public int[][] solution(int n) {  
        Hanoi(n, 123);
        
        // 리스트에 저장한 값들을 2차원 배열로 옮기기
        int[][] answer = new int[list.size()][2];   // 배열 크기 주의!
                
        for(int i = 0 ; i < list.size() ; i++) {
            int[] cmd = list.get(i);
            answer[i][0= cmd[0];
            answer[i][1= cmd[1];
        }
        
        return answer;
    }
    
    private static void Hanoi(int n, int from, int via, int to) {
        if(n == 1) {
            list.add(new int[] {from, to});
            return;
        }
 
        Hanoi(n - 1, from, to, via);        // 1) 원반 n-1개를 1→2로 이동
        list.add(new int[] {from, to});     // 2) 원반 1개를 1→3으로 이동
        Hanoi(n - 1, via, from, to);        // 3) 원반 n-1개를 2→3으로 이동
    }
}
cs

 

 

 

➕ 다른 풀이 방식

- 배열을 저장한 리스트를 람다를 활용해 1줄로 표현하시다...

int[][] answer = list.stream().toArray(int[][]::new);
 

[JAVA/자바][프로그래머스 12946] 하노이의 탑

문제 https://school.programmers.co.kr/learn/courses/30/lessons/12946 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘

hojunking.tistory.com


💦 어려웠던 점

- List<int[]>를 활용해 시작점과 도착점을 저장할 생각을 하지 못 했다. 그냥 2차원 배열 하나 더 만들어서 거기에 인덱스대로 값 저장해서 쓰려고 했는데 하나가 밀리고 입력이 제대로 안 되길래 다른 분 답 보고 해결하였다,,,

 

 

1회독 2회독 3회독 4회독 5회독
V 240707      

 

 

(+240707 2회독)

- List<int[]>를 쓸 생각을 했다.

- 하노이의 탑 방법) 원판을 1>2, 1>3, 2>3 순서로 이동시킬 아이디어도 스스로 떠올렸다.

- 하노이 함수 인자로 남은 인자 갯수를 가져간다는 것을 빠뜨렸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.*;
 
class Solution {
    static List<int[]> list = new ArrayList<>();
    
    public int[][] solution(int n) {
        Hanoi(n, 1,2,3);
        
        int[][] answer = new int[list.size()][2];
        for(int i = 0 ; i < answer.length ; i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
    
    private static void Hanoi(int n, int from, int via, int to) {
         if(n == 1) {
             list.add(new int[]{from, to});
             return;
         }
        
         Hanoi(n-1, from, to, via);     // 1 → 2
         list.add(new int[]{from, to}); // 1 → 3
         Hanoi(n-1, via, from, to);     // 2 → 3
    }
}
cs


(참고)

 

[프로그래머스] 하노이의 탑 (Java)

프로그래머스 하노이의 탑하노이의 탑은 재귀의 기초 문제로 널리 쓰이는 문제다. 그만큼 재귀의 특성을 잘 담고있는 문제기 때문에 제대로 알아둘 필요가 있다. 이 보다 더 잘 정리한 글이 있

velog.io

 

[백준/JAVA] 11729번: 하노이 탑 이동 순서

🔺 문제 11729번: 하노이 탑 이동 순서 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에

bono039.tistory.com

 

반응형