본문 바로가기

문제 풀이/인프런

[JAVA11/알고리즘]4-2 아나그램

문제


Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아나그램이라고 합니다.

 

예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만 그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로

알파벳과 그 개수가 모두 일치합니다.

즉 어느 한 단어를 재 배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다.

 

길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세요.

아나그램 판별시 대소문자가 구분됩니다. 


입력

첫 줄에 첫 번째 단어가 입력되고, 두 번째 줄에 두 번째 단어가 입력됩니다.

단어의 길이는 100을 넘지 않습니다


출력 

두 단어가 아나그램이면 “YES"를 출력하고, 아니면 ”NO"를 출력합니다.


예시 입력 1 

AbaAeCe
baeeACA


예시 출력 1

 

YES


예시 입력 2

 

abaCC
Caaab

 

예시 출력 2

NO

 

 



해결

 

문제에서 길이가 같은 문자열 2개가 주어진다고 하였다. 이 점을 활용하면 좀 더 편하게 코드를 짤 수 있다.
알파벳의 종류를 key로두고, 개수를 value로 가지는 HashMap을 만들었다.

 

 HashMap<Character,Integer>map = new HashMap<>();
        for(char x: str1.toCharArray()){
            map.put(x, map.getOrDefault(x,0)+1);
        }

위 과정이 위에서 말한 HashMap인 map을 만드는 과정이다.

그리고 2번째로 받은 문자열을 하나하나 비교한다.


 위 그림은 예제 2의 알파벳 종류와 그에 대응하는 개수를 나타낸 것이다.

내가 만든 map에서 a,b,C는 key가 되고, 밑에 개수들은 value가 된다.

 

그리고 2번째로 입력받은 문자열을 저 HashMap과 비교할건데, 

문자 하나하나 비교하면서 그 문자(key)에 대응하는 value를 하나씩 감소시켜 줄거시다.

여기서 2번째로 입력받은 문자열을 처음으로 입력받은 문자열과 비교하다가 아나그램이 아닐경우는 두가지가 존재한다.

 

1.문자의 종류가 다른 문자가 존재할 경우

 

2.문자의 종류는 같지만 개수가 다를 경우

 

밑 코드에서 1번의 경우는 containsKey()를 사용하였고, 두번째는 get()을 이용하여, map의 value가 0보다 크면 1을 감소시키고, 0이면 NO를 return 시켰다.

 

 

 

CODE
 



import java.util.*;

public class Main {
    public static String solution(String str1,String str2){
        String answer = "YES";
        HashMap<Character,Integer>map = new HashMap<>();
        for(char x: str1.toCharArray()){
            map.put(x, map.getOrDefault(x,0)+1);
        }
        for(char x : str2.toCharArray()){
            if(!map.containsKey(x) || map.get(x)==0) return "NO";
            map.put(x,map.get(x)-1);
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str1 = in.nextLine();
        String str2 = in.nextLine();

        System.out.println(solution(str1,str2));
    }
}


 

 


결과