하루 종일 내리는 비에 세상이 출렁이고 구름이 해를 먹어 밤인지 낮인지 모르는 어느 여름 날
잠 들기 싫어 버티던 호석이는 무거운 눈꺼풀에 패배했다. 정신을 차려보니 바닥에는 격자 모양의 타일이 가득한 세상이었고, 각 타일마다 알파벳 소문자가 하나씩 써있다더라. 두려움에 가득해 미친듯이 앞만 보고 달려 끝을 찾아 헤맸지만 이 세상은 끝이 없었고, 달리다 지쳐 바닥에 드러누우니 하늘에 이런 문구가 핏빛 구름으로 떠다니고 있었다.
호석이는 하늘을 보고서 "환형이 무엇인지는 알려달라!" 며 소리를 지르니 핏빛 구름이 흩어졌다가 모이며 아래와 같은 말을 그렸다.
세상을 이루는 격자의 정보와, K 개의 문자열이 주어졌을 때, 호석이가 대답해야 하는 정답을 구해주도록 하자.
첫번째 줄에 격자의 크기 N, M과 신이 좋아하는 문자열의 개수 K 가 주어진다.
다음에 N개의 줄에 걸쳐서 M개의 알파벳 소문자가 공백없이 주어진다. 여기서의 첫 번째 줄은 1행의 정보이며, N 번째 줄은 N행의 정보이다.
이어서 K개의 줄에 걸쳐서 신이 좋아하는 문자열이 주어진다. 모두 알파벳 소문자로 이루어져 있다.
K개의 줄에 걸쳐서, 신이 좋아하는 문자열을 만들 수 있는 경우의 수를 순서대로 출력한다.
3 3 2
aaa
aba
aaa
aa
bb
56
0
3 4 3
abcb
bcaa
abac
aba
abc
cab
66
32
38
int dx = (x + d[0] + N) % N;
int dy = (y + d[1] + M) % M;
memo[n][m][l] = (n, m) 위치에서 시작하여 타겟의 l 번째 문자에 도달했을 떄까지의 경우의 수
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class StringHell {
private static int N, M, K;
private static char[][] map;
private static int[][][] memo;
private static final int MAX_WORD_LENGTH = 5;
static final int[][] dir = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } };
public int DFS(int L, int x, int y, char[] target) {
if (L == target.length - 1) {
return 1;
}
if (memo[x][y][L] != -1) {
return memo[x][y][L];
}
int cnt = 0;
for (int[] d : dir) {
int dx = (x + d[0] + N) % N;
int dy = (y + d[1] + M) % M;
if (map[dx][dy] == target[L + 1]) {
cnt += DFS(L + 1, dx, dy, target);
}
}
memo[x][y][L] = cnt;
return cnt;
}
public static void main(String[] args) throws IOException {
StringHell T = new StringHell();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] nums = br.readLine().split(" ");
N = Integer.parseInt(nums[0]);
M = Integer.parseInt(nums[1]);
K = Integer.parseInt(nums[2]);
map = new char[N][M];
memo = new int[N][M][MAX_WORD_LENGTH];
for (int n = 0; n < N; n++) {
char[] words = br.readLine().toCharArray();
for (int m = 0; m < M; m++) {
map[n][m] = words[m];
}
}
for (int i = 0; i < K; i++) {
for (int n = 0; n < N; n++) {
for (int m = 0; m < M; m++) {
for (int l = 0; l < MAX_WORD_LENGTH; l++) {
memo[n][m][l] = -1;
}
}
}
char[] target = br.readLine().toCharArray();
int cnt = 0;
for (int n = 0; n < N; n++) {
for (int m = 0; m < M; m++) {
if (map[n][m] == target[0]) {
cnt += T.DFS(0, n, m, target);
}
}
}
System.out.println(cnt);
}
}
}
이거.. 무슨 소설이에요? 도입부가 신선하네요^^