https://www.acmicpc.net/problem/20166
구현 문제입니다.
문제 구현 순서는 다음과 같습니다.
- 신이 좋아하는 문자열의 길이가 1~5이기 때문에, 격자에서 길이가 1~5인 문자열 모두를 만든다.
- 문자열을 만드는 탐색은 8방향으로 한다.
- 범위가 벗어나면 반대편으로 이동하게 조정한다.
- 문자열의 중복 개수를 map에 저장한다.
- 만들어진 문자들과 신이 좋아하는 문자와 비교해서 답을 도출한다.
[구현 코드]
import java.util.*;
import java.io.*;
public class Main {
private static final int[] dx = {-1, 1, 0, 0, -1, 1, 1, -1};
private static final int[] dy = {0, 0, -1, 1, 1, 1, -1, -1};
private static char[][] map;
private static Map<String, Integer> godLoveWords;
private static int n, m, k;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stz = new StringTokenizer(br.readLine(), " ");
n = Integer.parseInt(stz.nextToken());
m = Integer.parseInt(stz.nextToken());
k = Integer.parseInt(stz.nextToken());
map = new char[n][m];
for(int i=0; i<n; i++){
String input = br.readLine();
for (int j = 0; j < m; j++) {
map[i][j] = input.charAt(j);
}
}
// 1. 신이 좋아하는 문자열의 길이가 1~5이기 때문에, 격자에서 길이가 1~5인 문자열 모두를 만든다.
makeGodLoveWords();
// 2. 만들어진 문자들과 신이 좋아하는 문자와 비교해서 답을 도출한다.
while (k-- > 0){
String god = br.readLine();
int num = godLoveWords.getOrDefault(god, 0);
bw.write(num + System.lineSeparator());
}
bw.flush();
bw.close();
br.close();
}
private static void makeGodLoveWords(){
int maxLen = 5;
godLoveWords = new HashMap<>();
for(int r=1; r<=maxLen; r++){
for(int i=0; i<n; i++){
for (int j = 0; j < m; j++) {
dfs(i, j, r, 1, String.valueOf(map[i][j]));
}
}
}
}
private static void dfs(int x, int y, int r, int depth, String str) {
if(depth == r){
// 1.3 문자열의 중복 개수를 map에 저장한다.
godLoveWords.put(str, godLoveWords.getOrDefault(str, 0 ) + 1);
return;
}
// 1.1 문자열을 만드는 탐색은 8방향으로 한다.
for(int i=0; i<8; i++){
// 1.2 범위가 벗어나면 반대편으로 이동하게 조정한다.
int nx = (x + dx[i]) % n;
int ny = (y + dy[i]) % m;
dfs(nx, ny, r, depth + 1, str + map[nx][ny]);
}
}
}
'알고리즘' 카테고리의 다른 글
프로그래머스 - 연속 펄스 부분 수열의 합(Java) (0) | 2023.03.29 |
---|---|
백준 - 5052 전화번호 목록(Java) (0) | 2023.03.28 |
백준 - 5430 AC(Java) (0) | 2023.03.28 |
프로그래머스 - 광물 캐기(Java) (0) | 2023.03.27 |
백준 - 13460 구슬 탈출 2(Java) (0) | 2023.03.23 |