[백준] 1593: 문자 해독 - JAVA

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

풀이

문자열 W와 S가 주어진다.

S를 W의 길이만큼 잘라 그 안의 문자 순서를 바꿨을 때 W로 만들 수 있는 개수를 세는 문제이다.

map을 두개 선언하여 하나에는 W에 들어있는 문자와 개수를 담았다.

또 다른 하나는 W의 길이만큼 S를 잘라 개수를 담았다.

슬라이딩 윈도우를 이용해 S를 탐색하면서 map의 개수를 조정하여

map 두 개가 같은지 비교하여 같을 경우 답을 하나 증가시켰다.


메모리: 149420KB

시간: 900ms

언어: Java 11

코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int g = Integer.parseInt(st.nextToken());
        int l = Integer.parseInt(st.nextToken());
        String W = br.readLine();
        String S = br.readLine();

        Map<Character, Integer> wMap = new HashMap<>();
        Map<Character, Integer> sMap = new HashMap<>();
        for (int i = 0; i < g; i++) {
            wMap.put(W.charAt(i), wMap.getOrDefault(W.charAt(i), 0) + 1);
            sMap.put(S.charAt(i), sMap.getOrDefault(S.charAt(i), 0) + 1);
        }
        int answer = 0;
        if (checkMaps(wMap, sMap)) {
            answer++;
        }

        int left = 0;
        int right = g;

        while (right < l) {
            sMap.put(S.charAt(left), sMap.get(S.charAt(left)) - 1);
            sMap.put(S.charAt(right), sMap.getOrDefault(S.charAt(right), 0) + 1);

            if (checkMaps(wMap, sMap)) {
                answer++;
            }

            left++;
            right++;
        }

        System.out.println(answer);
    }

    private static boolean checkMaps(Map<Character, Integer> wMap, Map<Character, Integer> sMap) {
        for (Map.Entry<Character, Integer> entry : wMap.entrySet()) {
            char key = entry.getKey();
            int value = entry.getValue();

            if (!sMap.containsKey(key) || sMap.get(key) != value) {
                return false;
            }
        }

        return true;
    }

}