문제 풀이 (JAVA)
import java.io.*;
import java.util.*;
public class part4_4 {
public static void main(String[] args) throws IOException {
// 모든 아나그램 찾기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String a = br.readLine();
String b = br.readLine();
int answer = solution(a.toCharArray(), b.toCharArray());
bw.write(Integer.toString(answer));
bw.flush();
bw.close();
}
private static int solution(char [] a , char [] b) {
int result=0;
int lt=0, rt=0;
int len = a.length;
HashMap<Character,Integer> map1 = new HashMap<>();
HashMap<Character,Integer> map2 = new HashMap<>();
for(Character ch : b) {
map2.put(ch, map2.getOrDefault(ch,0)+1);
}
while(lt < len && rt < len) {
if((rt-lt) == b.length) { // T의 문자열 길이와 슬라이딩윈도우 크기가 같다면
if(map2.equals(map1)== true) { // 해쉬맵이 같을시 동일하므로 결과값 증가
result++;
}
if(map1.containsKey(a[lt])) { // 슬라이딩 윈도우 해시맵에 키가 존재한다면 -1
map1.put(a[lt], map1.getOrDefault(a[lt], 0)-1);
if( map1.get(a[lt]) == 0) { // 왼쪽 인덱스 제거 후 0이라면 중복값x
map1.remove(a[lt]); // 해당 왼쪽 인덱스 값 제거
}
}
lt++;
if(rt==len-1) { // rt가 마지막 인덱스에 왔을때 처리문
if(map2.containsKey(a[rt])) {
map1.put(a[rt], map1.getOrDefault(a[rt], 0)+1);
}
if(map2.equals(map1)== true) {
result++;
}
rt++; // while문 종료
}
}
if((rt-lt) < b.length) { // 인덱스가 T의 길이만큼이 아니라면 오른쪽 인덱스 값을 해시맵에 추가
if(map2.containsKey(a[rt])) {
map1.put(a[rt], map1.getOrDefault(a[rt], 0)+1);
}
rt++;
}
}
return result;
}
}
주요 핵심 포인트
1. 해당 문제 또한 4-3과 비슷하게 풀었다. 투 포인터 인덱스를 0부터 시작하여 lt와 rt의 차를 이용하여 길이보다 작다면 계속해서 오른쪽 인덱스 값을 넣고 같아지면 값을 비교하여 처리하고, 왼쪽 포인터를 다시 증가시키는 로직을 반복하였다.
2. 오른쪽 끝 인덱스 처리를 위하여 오른쪽 인덱스가 끝자리에 왔다면 값을 처리해주고 while문이 종료되도록 rt를 하나 증가시켰다.
개선해야할 사항
1. 인프런에서 푼 코드는 기존에 값을 T-1만큼 해시맵에 추가해두고 마지막행부터 rt를 시작하도록 하였다. 나도 다음부터는 미리 값을 넣어놓고 비교해야겠다.
'알고리즘' 카테고리의 다른 글
[스택] 올바른 괄호 (인프런 알고리즘 5-1) (0) | 2022.06.19 |
---|---|
[트리셋(TreeSet)] K번째 큰 수 (인프런 알고리즘 4-5) (0) | 2022.06.19 |
[해쉬맵+슬라이딩윈도우] 매출액의 종류 (인프런 알고리즘 4-3) (0) | 2022.06.16 |
[해쉬맵] 아나그램(해쉬) (인프런 알고리즘 4-2) (0) | 2022.06.14 |
[해쉬맵] 학급 회장(해쉬) (인프런 알고리즘 4-1) (0) | 2022.06.12 |