빙응의 공부 블로그
[BOJ S2][#DFS]2210번 숫자판 점프 본문
숫자판 점프 성공다국어
한국어
시간 제한메모리 제한제출정답맞힌 사람정답 비율
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]);
}
}
}
}
'Argorithm' 카테고리의 다른 글
[BOJ G4][#투포인터]1806번 부분합 (1) | 2024.07.15 |
---|---|
[BOJ S1][#DFS]2667번 단지번호붙이기 (0) | 2024.07.13 |
[BOJ G5][#투포인터, #회문]회문 (0) | 2024.07.11 |
[BOJ S1][#DFS]1325번 효율적인 해킹 (0) | 2024.07.05 |
[BOJ S2][#DFS]11724번 연결 요소의 개수 (0) | 2024.07.05 |