<섹션4-HashMap, TreeSet> 4. 모든 아나그램 찾기

조이·2022년 1월 11일
0

자바 알고리즘

목록 보기
34/41
post-thumbnail

4. 모든 아나그램 찾기

<설명>

S문자열에서 T문자열과 아나그램이 되는 S의 부분문자열의 개수를 구하는 프로그램을 작성하
세요. 아나그램 판별시 대소문자가 구분됩니다. 부분문자열은 연속된 문자열이어야 합니다.

<입력>

첫 줄에 첫 번째 S문자열이 입력되고, 두 번째 줄에 T문자열이 입력됩니다.
S문자열의 길이는 10,000을 넘지 않으며, T문자열은 S문자열보다 길이가 작거나 같습니다.

<출력>

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

===================================================

<코드>

먼저 아나그램이 되는 문자열을 HashMap에 저장해준다. 그 후 아나그램이 되는 문자열의 길이보다 하나 작은 값만큼 다른 문자열을 또 다른 HashMap에 저장해준다. 이제 for문을 이용하여 값을 하나씩 추가하여 같은지 비교한다. 같다면 값을 추가한다. 앞의 문자열부터 하나씩 값을 줄이고 0이 되면 키와 값을 모두 삭제한다.

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

public class Main {
	public int solution(String a, String b){
		int answer=0;
		HashMap<Character, Integer> am=new HashMap<>();
		HashMap<Character, Integer> bm=new HashMap<>();
		for(char x : b.toCharArray()) bm.put(x, bm.getOrDefault(x, 0)+1);
		int L=b.length()-1;
		for(int i=0; i<L; i++) am.put(a.charAt(i), am.getOrDefault(a.charAt(i), 0)+1);
		int lt=0;
		for(int rt=L; rt<a.length(); rt++){
			am.put(a.charAt(rt), am.getOrDefault(a.charAt(rt), 0)+1);
			if(am.equals(bm)) answer++;
			am.put(a.charAt(lt), am.get(a.charAt(lt))-1);
			if(am.get(a.charAt(lt))==0) am.remove(a.charAt(lt));
			lt++;
		}
		return answer;
	}
	
	public static void main(String[] args) {
		Main main = new Main();
		Scanner scan = new Scanner(System.in);
		
		String str=scan.next();
		String d=scan.next();
		
		System.out.println(main.solution(str, d));
	}
}

<중요>

1) HashMap은 비교 가능

  • am.equals(bm)으로 비교 할 수 있다.
profile
joy_study

0개의 댓글