본문으로 바로가기

[알고리즘]모든 아나그램 찾기

category Algorithm/HashMap, ArrayList 2021. 10. 21. 20:18
728x90
반응형

▷ 문제

S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을 작성하세요.

아나그램 판별시 대소문자가 구분됩니다. 부분문자열은 연속된 문자열이어야 합니다.

* 입력

첫 줄에 첫 번째 S문자열이 입력되고, 두 번째 줄에 T문자열이 입력됩니다.

S문자열의 길이는 10,000을 넘지 않으며, T문자열은 S문자열보다 길이가 작거나 같습니다.

* 출력

S단어에 T문자열과 아나그램이 되는 부분문자열의 개수를 출력합니다.

▷ 입력 예시

bacaAacba

abc

▷ 출력 예시

3

▷ 풀이

import java.util.Scanner;
import java.util.HashMap;

public class Main {	
    public int solution(String n, String k){
      int answer = 0;      
      HashMap<Character, Integer> map1 = new HashMap<Character, Integer>();
      HashMap<Character, Integer> map2 = new HashMap<Character, Integer>();

      for(char x : k.toCharArray()) {
        map2.put(x, map2.getOrDefault(x, 0) + 1);        
      }            

      int L = k.length()-1;
      for(int i=0; i<L; i++){
        map1.put(n.charAt(i), map1.getOrDefault(n.charAt(i), 0) + 1);        
      }

      int lt = 0;      
      for(int rt=L; rt<n.length(); rt++){
        map1.put(n.charAt(rt), map1.getOrDefault(n.charAt(rt),0) + 1);
        if(map1.equals(map2)){
          answer++;
        }
        map1.put(n.charAt(lt), map1.get(n.charAt(lt))-1);
        if(map1.get(n.charAt(lt)) == 0){
          map1.remove(n.charAt(lt));
        }
        lt++;        
      }
      
      return answer;
    }

    public static void main(String[] args){
        Main main = new Main();
        Scanner kb = new Scanner(System.in);

        String n = kb.next();
        String k = kb.next();
        
        System.out.println(main.solution(n, k));
    }
  }

 

반응형