관리 메뉴

Mini

[틀림] 백준 문자열 지옥에 빠진 호석 // 문자열, 먼저계산 dp, dfs 본문

Algorithm/dp

[틀림] 백준 문자열 지옥에 빠진 호석 // 문자열, 먼저계산 dp, dfs

Mini_96 2025. 5. 12. 00:12

https://www.acmicpc.net/problem/20166

* 시도1

10*10 이니까 그냥 dfs로 완탐하면 될듯? -> 시간초과

100칸마다 각각 8방향 && depth 5제한 

 

* 풀이

미리 계산후, 쿼리하는 방식으로 개선

시간복잡도 : 3,276,800(3백만) + 1000(조회)

정답코드

dfs가 과거풀이,

dfs2가 캐시 미리계산 코드.

string을 인자로 넘기는게 범인이 아니었음.

import java.io.*;
import java.util.*;

public class Main {

    static int ret, n, m, k;
    static char[][] arr = new char[14][14];
    static int[] dx = {0, 1, 0, -1, -1, 1, -1, 1};
    static int[] dy = {1, 0, -1, 0, -1, 1, 1, -1};
    static HashMap<String, Integer> cache = new HashMap<>();

    static void dfs(int y, int x, int depth, String s, String target) {
        if (s.length() == target.length()) {
            if (s.equals(target)) {
                ret++;
            }
            return;
        }

        for (int i = 0; i < 8; ++i) {
            int ny = y + dy[i];
            int nx = x + dx[i];
            if (ny < 0) {
                ny = n - 1;
            }
            if (nx < 0) {
                nx = m - 1;
            }
            if (ny >= n) {
                ny = 0;
            }
            if (nx >= m) {
                nx = 0;
            }
            dfs(ny, nx, depth + 1, s + arr[ny][nx], target);
        }
    }

    static void dfs2(int y, int x, int depth, String s) {
        if(s.length()==6){
            return;
        }
        if(cache.containsKey(s)){
            cache.put(s,cache.get(s)+1);
        }
        else{
            cache.put(s,1);
        }

        for (int i = 0; i < 8; ++i) {
            int ny = y + dy[i];
            int nx = x + dx[i];
            if (ny < 0) {
                ny = n - 1;
            }
            if (nx < 0) {
                nx = m - 1;
            }
            if (ny >= n) {
                ny = 0;
            }
            if (nx >= m) {
                nx = 0;
            }
            dfs2(ny, nx, depth + 1, s + arr[ny][nx]);
        }
    }

    public static void main(String[] args) throws IOException {
        // FastIO implementation
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        for (int i = 0; i < n; ++i) {
            String tmp = br.readLine();
            for (int j = 0; j < m; ++j) {
                arr[i][j] = tmp.charAt(j);
            }
        }

        //모든 경우 미리계산!
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                dfs2(i, j, 0, String.valueOf(arr[i][j]));
            }
        }

        for (int q = 0; q < k; ++q) {
            String target = br.readLine();
            sb.append(cache.getOrDefault(target,0)).append("\n");
        }

//        for (int q = 0; q < k; ++q) {
//            String target = br.readLine();
//            ret = 0;
//
//            if(cache.containsKey(target)){
//                ret = cache.get(target);
//            }
//            else{
//                for (int i = 0; i < n; ++i) {
//                    for (int j = 0; j < m; ++j) {
//                        dfs(i, j, 0, String.valueOf(arr[i][j]), target);
//                    }
//                }
//                cache.put(target, ret);
//            }
//            sb.append(ret).append("\n");
//        }

        System.out.println(sb);
        br.close();
    }
}