코딩테스트 및 알고리즘
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에 값이 존재 할 때와 아닐 때를 따로 써 줌