본문 바로가기
알고리즘 문제풀이 입문: 코딩테스트 대비/섹션 4. HashMap, TreeSet (해쉬, 정렬지원 Set)

아나그램(해쉬)

by _비니_ 2024. 4. 2.

 

문제 이해

 

순서 상관없이 들어있는 알파벳이 같으면 YES, 다르면 NO를 출력하는 문제이다.

 

문제 해결

 

알파벳의 나열들을 스캐너 객체를 사용해 각각 str1과 str2로 받아주었다.

Scanner in = new Scanner(System.in);
String str1 = in.nextLine();
String str2 = in.nextLine();

 

이전 문제와 마찬가지로 str1을 String 형태로 입력받았으므로 toCharArray() 과정이 필요하다. char 데이터 타입 key로 하나씩 받아 key가 존재하면 key의 값을, 없으면 0을 return 하고 그 값에서 1을 더해 map1에 넣어준다. 즉 해당 알파벳(key)이 들어올 때마다  그 개수(value)가 증가되는 코드이다

 

마찬가지로 str2도 똑같은 과정으로 map2에 넣어준다.

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

HashMap<Character, Integer> map2 = new HashMap<>();
for(char key : str2.toCharArray()) {
    map2.put(key, map2.getOrDefault(key,0) + 1);
}

.

 

그런 후에 만약 map1이 map2와 동일하다면 "YES"를 출력해주고, 동일하지 않다면 "NO"를 출력하는 코드를 작성해주면 된다. 

 

처음에는 아래와 같이 비교를 했는데, 다른 답이 나왔다. 이 메서드 호출은 map1 map2라는 값 자체를 가지고 있는지를 검사하는 것으로, 두 HashMap의 내용을 비교하는 올바른 방법이 아니다.

if(map1.containsValue(map2))
    System.out.println("Yes"); 
else 
    System.out.println("No");

 

 

아래와 같이 equals 를 사용해 비교해주어야 한다.

if(map1.equals(map2))
    System.out.println("YES");
else
    System.out.println("NO");

 

 

최종 코드

 

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

public class P02_아나그램_해쉬 {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        String str1 = in.nextLine();
        String str2 = in.nextLine();

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

        HashMap<Character, Integer> map2 = new HashMap<>();
        for(char key : str2.toCharArray()) {
            map2.put(key, map2.getOrDefault(key,0) + 1);
        }

        if(map1.equals(map2))
            System.out.println("YES");
        else
            System.out.println("NO");
    }
}
반응형