이번에 풀어본 문제는
백준 2210번 숫자판 점프 입니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static String [][] map;
static int [] dx = {-1,1,0,0};
static int [] dy = {0,0,-1,1};
static Set<String> hs;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
map = new String[5][5];
for(int i = 0; i < 5; ++i)
{
st = new StringTokenizer(br.readLine());
for(int j =0; j < 5; ++j)
{
map[i][j] = st.nextToken();
}
}
hs = new HashSet<>();
for(int i = 0; i < 5; ++i)
{
for(int j = 0; j < 5; ++j)
{
dfs(i,j,map[i][j],1);
}
}
System.out.println(hs.size());
}
static void dfs(int x, int y, String str,int len)
{
if(len == 6)
{
hs.add(str);
return;
}
for(int idx = 0; idx < 4; ++idx)
{
int mx = x + dx[idx];
int my = y + dy[idx];
if(!isValid(mx,my)) continue;
dfs(mx,my,str+map[mx][my],len+1);
}
}
static boolean isValid(int x, int y)
{
return x >= 0 && y >= 0 && x < 5 && y < 5;
}
}
임의의 칸으로부터 사방으로 5번 이동하여 길이6의 숫자를 만든다고 할 때, 중복없이 만들 수 있는 숫자의 총 갯수를 구하는 문제입니다. 갔던곳을 또 가도 상관없다는 조건이 있습니다.
시작 인덱스를 선택하여 길이가 6이 될때까지 사방으로 계속 이동해주고, 길이가 6이 되었을 때 set에 담아주면 됩니다. set은 중복값을 가지지 않기 때문에, set을 활용하면 따로 중복값을 처리해주지 않아도 정답을 구할 수 있습니다.
갔던 경로를 다시 갈 수 있다는 조건 덕분에 좀 더 쉽게 해결할 수 있었던 것 같습니다!