• 문제 링크
2210번: 숫자판 점프
111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, 212121 이 가능한 경우들이다.
www.acmicpc.net
• 풀이 과정
5 * 5 크기의 String 배열 map 에 입력받은 값을 저장하고
배열을 전체 탐색하여 지정한 시작점의 값과 좌표를 매개 변수로 전달하여 재귀 함수를 실행한다.
시작점에서부터 4 방향 탐색을 수행하여 이동할 위치가 배열의 범위 내인지 확인한다.
재귀 호출을 통해 이동을 수행하며 String 형 매개 변수 s 에 이동할 위치의 값을 누적하고,
해당 위치의 좌표와 함께 전달한다.
s 의 길이가 6 일시(s.length() == 6) 하나의 경우의 수의 탐색을 완료했으므로,
s 가 이미 탐색한 경우의 수가 아닐 시 (!list.contains(s))
각각의 경우의 수를 저장할 List 객체 list 에 s 를 저장한다.
끝으로 서로 다른 여섯 자리의 개수, 즉 list.size() 를 정답으로써 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
public class Main {
static String[][] map = new String[5][5];
static List<String> list = new ArrayList<>();
static int[] dy = {-1, 1, 0, 0};
static int[] dx = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i = 0; i < 5; i++)
map[i] = br.readLine().split(" ");
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++)
recur(map[i][j], i, j);
}
bw.write(list.size() + "\n");
bw.flush();
}
private static void recur(String s, int y, int x) {
if (s.length() == 6) {
if (!list.contains(s))
list.add(s);
return;
}
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (ny < 0 || nx < 0 || ny >= 5 || nx >= 5)
continue;
recur(s + map[ny][nx], ny, nx);
}
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 16637 괄호 추가하기 - Brute Force / Java (0) | 2022.08.08 |
---|---|
[백준] 3019 테트리스 - Brute Force / Java (0) | 2022.08.07 |
[백준] 16938 캠프 준비 - Brute Force / Java (0) | 2022.08.05 |
[백준] 16937 두 스티커 - Brute Force / Java (0) | 2022.08.04 |
[백준] 16924 십자가 찾기 - Brute Force / Java (0) | 2022.08.03 |
댓글