빙응의 공부 블로그

[BOJ S2][#DFS]2210번 숫자판 점프 본문

Argorithm

[BOJ S2][#DFS]2210번 숫자판 점프

빙응이 2024. 7. 12. 17:48

숫자판 점프 성공다국어

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 9916 7307 5860 74.536%

문제

5×5 크기의 숫자판이 있다. 각각의 칸에는 숫자(digit, 0부터 9까지)가 적혀 있다. 이 숫자판의 임의의 위치에서 시작해서, 인접해 있는 네 방향으로 다섯 번 이동하면서, 각 칸에 적혀있는 숫자를 차례로 붙이면 6자리의 수가 된다. 이동을 할 때에는 한 번 거쳤던 칸을 다시 거쳐도 되며, 0으로 시작하는 000123과 같은 수로 만들 수 있다.

숫자판이 주어졌을 때, 만들 수 있는 서로 다른 여섯 자리의 수들의 개수를 구하는 프로그램을 작성하시오.

입력

다섯 개의 줄에 다섯 개의 정수로 숫자판이 주어진다.

출력

첫째 줄에 만들 수 있는 수들의 개수를 출력한다.

예제 입력 1 복사

1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 2 1
1 1 1 1 1

예제 출력 1 복사

15

 

📝 풀이

  • DFS로 한번 돌리면 쉬운 문제이다. 
  • 중복된 것을 피하기 위해 HashSet을 이용하면 아주 쉽게 풀 수 있다.
import java.io.*;
import java.util.*;
public class Main {
    static int[][] board = new int[5][5];
    static Set<String> numbers = new HashSet<>(); //중복을 피하기 위한 HashSet
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        for(int i = 0; i < 5; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j = 0; j < 5; j++){
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        // 각 위치에서 시작하여 DFS 탐색
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                dfs(i, j, Integer.toString(board[i][j]));
            }
        }
        System.out.println(numbers.size());
    }
    public static void dfs(int x, int y, String number){

        if(number.length() >= 6){
            numbers.add(number);
            return;
        }
                // 상하좌우로 이동하면서 다음 위치로 재귀 호출
                for (int d = 0; d < 4; d++) {
                    int nx = x + dx[d];
                    int ny = y + dy[d];
                    
                    if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5) {
                        dfs(nx, ny, number + board[nx][ny]);
                    }
                }
    }
}