코딩테스트 및 알고리즘

T문자열과 아나그램이 되는 S문자열의 부분문자열 개수 구하기

영카이브 2024. 1. 6. 00:20

문제.  T문자열과 아나그램이 되는  S문자열의 부분문자열 개수를 구하는 프로그램을 작성하세요. ( 대소문자는 구분해야합니다.)

 

입력예시 

abddcadavcbabcdbdacabcdefsabdedcab
abcd

 

답 : 4

 

나의 답변

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

public class Main {	
	public int solution(String s, String t){
		int answer=0; 
		int sLen = s.length();
		int tLen = t.length();
		HashMap<Character, Integer> targetMap = new HashMap<>();
		HashMap<Character, Integer> windowMap= new HashMap<>();
		
		// 타겟 해시맵
		for( int i=0; i<tLen; i++ ){
			if(targetMap.containsKey(t.charAt(i))) targetMap.put(t.charAt(i), targetMap.get(t.charAt(i))+1);
			else targetMap.put(t.charAt(i), 1);
		}
		
		// 초기 윈도우 창
		for( int i=0; i<tLen; i++) {
			if(windowMap.containsKey(s.charAt(i))) windowMap.put(s.charAt(i), windowMap.get(s.charAt(i))+1);
			else windowMap.put(s.charAt(i), 1);
		}
		
		// 타겟 맵과 초기윈도우가 같으면 answer++;
		if(targetMap.equals(windowMap)) answer++; 
		
		// 윈도우맵과 타겟맵 비교
		int lt=0; 
		for( int rt=tLen; rt<sLen; rt++ ) {
			if(windowMap.containsKey(s.charAt(rt))) windowMap.put(s.charAt(rt), windowMap.get(s.charAt(rt))+1);
			else windowMap.put(s.charAt(rt), 1);
			if(windowMap.get(s.charAt(lt))==1) windowMap.remove(s.charAt(lt));
			else windowMap.put(s.charAt(lt), windowMap.get(s.charAt(lt))-1);
			if(targetMap.equals(windowMap)) answer++; 
			lt++;
		}	
		return answer; 
	}
	public static void main(String[] args) {
		Main T = new Main();
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		String t = sc.next();
		System.out.println(T.solution(s,t));
	}
}

 

  • T문자열은 고정된 길이이므로 슬라이딩 윈도우를 활용해 S문자열의 부분문자열을 같은 길이 만큼 비교 
  • equals 메서드를 활용해 같은 문자열인지 확인
  • JAVA17에서는 getOrDefault() 사용 불가 >>>> HashMap에 값이 존재 할 때와 아닐 때를 따로 써 줌