문제

https://www.acmicpc.net/problem/2210

 

2210번: 숫자판 점프

111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, 212121 이 가능한 경우들이다.

www.acmicpc.net

문제 접근

  • 숫자판의 임의의 위치에서 인접한 4방향으로 5번 이동하면서 숫자판에 적힌 숫자를 붙이는 것이 핵심적인 기능이다.
    • 이동 시에 이미 방문했던 칸을 다시 방문해도 상관없다는 조건이 붙어 있다.
    • 숫자가 0인 경우에도 0으로 시작하는 수를 만들 수 있다.
  • 위의 규칙을 만족시키면서 숫자판에서 이동할 때 나올 수 있는 모든 숫자의 개수를 구하는 것이 문제에서 요구하는 내용이다.
  • 숫자판의 임의의 위치에서 시작하므로 나올 수 있는 모든 숫자의 개수를 구하기 위해서는 5 X 5 크기의 모든 숫자판을 시작점으로 두어 위의 핵심 기능을 수행하도록 하는 것이 해법이다.
  • 핵심 기능을 구현하는 것은 재귀를 활용해서 구현할 수 있으며 DFS 방법을 사용할 수 있다.

정답 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

  static String[][] board;
  static int[] dx = {0, 0, 1, -1};
  static int[] dy = {1, -1, 0, 0};
  static Set<String> answer;

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    board = new String[5][5];
    answer = new HashSet<>();

    for (int i = 0; i < 5; i++){
      StringTokenizer st = new StringTokenizer(br.readLine());

      for (int j = 0; j < 5; j++){
        board[i][j] = st.nextToken();
      }
    }

    for (int i = 0; i < 5; i++){
      for (int j = 0; j < 5; j++){
        dfs(i, j, board[i][j], 0);
      }
    }

    System.out.println(answer.size());
  }

  public static void dfs(int y, int x, String currentString, int moveCount){
    if (moveCount == 5){
      answer.add(currentString);
      return;
    }

    for (int i = 0; i < 4; i++){
      int ny = y + dy[i];
      int nx = x + dx[i];

      if (ny < 0 || ny >= 5 || nx < 0 || nx >= 5){
        continue;
      }

      dfs(ny, nx, currentString + board[ny][nx], moveCount + 1);
    }
  }
}

 

'Algorithm > BruteForce' 카테고리의 다른 글

[백준][BOJ 1969] - DNA  (1) 2023.10.02
[백준][BOJ 4134] - 다음 소수  (0) 2023.10.02
[백준][BOJ] 27958 사격 연습  (0) 2023.04.06
[BOJ 18428] 감시 피하기  (0) 2022.12.10
[Programmers] 전력망을 둘로 나누기 - python  (1) 2022.11.23
복사했습니다!