[백준 1593] 문자 해독(Java)

최민길(Gale)·2023년 12월 3일
1

알고리즘

목록 보기
160/172

문제 링크 : https://www.acmicpc.net/problem/1593

이 문제는 슬라이딩 윈도우 방식을 이용하여 풀 수 있습니다.

문제에서 요구하는 내용이 해당 글자의 순서는 상관없이 글자가 존재하기만 한다면 단어로 선택되는 것이기 때문에 해당 글자 범위만큼 탐색 범위가 고정됩니다. 따라서 슬라이딩 윈도우 방식으로 처음과 끝 포인터만 증가시켜 탐색을 진행합니다.

이 때 현재 인덱스 별 값 계산을 위해 맵을 사용합니다. 맵에 인덱스, 개수 형식으로 저장하여 현재 인덱스가 몇 번 나왔는지를 카운트한 후 맵을 카운팅하면서 현재 체크된 수와 비교합니다.

다음은 코드입니다.

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

class Main{
    static int res = 0;
    static Map<Integer, Integer> map = new HashMap<>();
    static int[] check = new int[100];

    public static void main(String[] args) throws Exception{
        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 std = br.readLine();
        String str = br.readLine();

        for(int i=0;i<std.length();i++){
            int idx = std.charAt(i)-'A';
            if(map.containsKey(idx)) map.replace(idx,map.get(idx)+1);
            else map.put(idx,1);
        }

        for(int i=0;i<g;i++){
            int idx = str.charAt(i)-'A';
            check[idx]++;
        }
        search();

        if(l==g){
            System.out.println(res);
            return;
        }

        int start = 1;
        int end = g;
        while(end < l){
            int idxS = str.charAt(start-1) - 'A';
            int idxE = str.charAt(end) - 'A';

            check[idxS]--;
            check[idxE]++;

            search();
            start++;
            end++;
        }

        System.out.println(res);
    }

    static void search(){
        Iterator<Integer> keys = map.keySet().iterator();
        while(keys.hasNext()){
            int idx = keys.next();
            if(check[idx] != map.get(idx)) return;
        }
        res++;
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글

관련 채용 정보