본문 바로가기
PS 문제 풀이/SWEA

[SWEA] 3816 아나그램

by 까망 하르방 2021. 3. 1.
반응형

출처: [SWEASW 문제해결 심화 - Ad Hoc Algorithms

 Input 

4

aba ababababa

abra abracadabra

anan bananaparanabrazil

ab abba

 

 Output 

#1 4

#2 2

#3 2

#4 2

 

① S1을 문자를 int형 배열에 저장한다. (Alphabet 빈도 수를 저장)

② S2를 S1의 길이만큼 부분문자열 구해서 int형 배열로 변환한다.

③ 알파벳 개수를 통해 Anagram 여부를 판단. 


import java.util.Scanner;
 
public class Solution {     
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // TestCase 개수
        int T = Integer.parseInt(sc.next());
         
        for(int tc=1; tc<=T; tc++) {
            // input
            char[] A = sc.next().toCharArray();
            char[] B = sc.next().toCharArray();
             
            // A 문자열을 알파뱃 개수 배열로 변환
            int [] aArr = makeAlphabet(A, 0, A.length);
             
            int lengthOfA = A.length;
            int i = 0;
            int ans = 0;
             
            while(true) {
                if(i+lengthOfA > B.length) break;
                // A의 길이 만큼 B의 부분문자열을 가져온다.
                int[] bArr = makeAlphabet(B, i, i+lengthOfA);
                // 부분문자열이 아나그램인지 확인
                if(isAnagram(aArr, bArr)) ans++;
                i++;
            }
            System.out.print("#" + tc + " ");
            System.out.println(ans);
        }
    }
     
    public static int[] makeAlphabet (char[] arr, int start, int end){
        int[] alphabet = new int[26];
        for (int i = start; i < end; i++) {
            alphabet[arr[i] - 'a']++; 
        }
        return alphabet;
    }
     
    private static boolean isAnagram(int[] aArr, int[] bArr) {
        for(int i=0; i<aArr.length; i++) {
            if(aArr[i] != bArr[i]) return false;
        }
        return true;
    }
}

 

반응형

'PS 문제 풀이 > SWEA' 카테고리의 다른 글

[SWEA] 1974 스도쿠 검증  (0) 2021.03.01
[SWEA] 1954 달팽이  (0) 2021.03.01
[SWEA] 3819 최대 부분 배열  (0) 2021.02.28
[SWEA] 2814 최장경로  (0) 2021.02.27
[SWEA] 1768 숫자야구게임  (0) 2021.02.27

댓글