문제. 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에 값이 존재 할 때와 아닐 때를 따로 써 줌
'코딩테스트 및 알고리즘' 카테고리의 다른 글
트리 (0) | 2024.01.08 |
---|---|
N장의 카드에서 3장 뽑고 그 합이 k번째로 큰 수 구하기 (0) | 2024.01.07 |
N일 동안 연속된 K일 동안의 매출액 종류 구하기 (2) | 2024.01.05 |
인기 상품 구하기 (2) | 2024.01.04 |
연속된 자연수의 합 (0) | 2024.01.02 |