아나그램(Hash)

최준호·2021년 8월 20일
0

알고리즘 강의

목록 보기
25/79

설명

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

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

알파벳과 그 개수가 모두 일치합니다. 즉 어느 한 단어를 재 배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다.

길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세요. 아나그램 판별시 대소문자가 구분됩니다.

코드

public class Anagram {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String input1 = in.next();
        String input2 = in.next();
        String solution = solution2(input1, input2);
        System.out.println(solution);
    }
    public static String solution(String input1, String input2){
        char[] chars1 = input1.toCharArray();
        char[] chars2 = input2.toCharArray();

        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();

        for(char c : chars1){
            map1.put(String.valueOf(c), map1.getOrDefault(String.valueOf(c),0)+1);
        }
        for(char c : chars2){
            map2.put(String.valueOf(c), map2.getOrDefault(String.valueOf(c),0)+1);
        }
        if(map1.equals(map2)) return "YES";
        else return "NO";
    }

    public static String solution2(String input1, String input2){
        char[] chars1 = input1.toCharArray();
        char[] chars2 = input2.toCharArray();

        Map<String, Integer> map = new HashMap<>();

        for(char c : chars1){
            map.put(String.valueOf(c), map.getOrDefault(String.valueOf(c),0)+1);
        }
        for(char c : chars2){
            if(!map.containsKey(String.valueOf(c)) || map.get(String.valueOf(c))==0) return "NO";    //key값이 존재하지 않거나 key값이 0일 경우
            map.put(String.valueOf(c),map.get(String.valueOf(c))-1);    //그 외의 경우 map에서 값을 1씩 감소시켜 모두 0이 되면 됨! 하지만 이 위의 조건에 걸릴 경우 이미 결과가 나오기 때문에 종료
        }

        return "YES";
    }
}

solution은 내가 풀이한 방법인데 간단하게 문제만을 생각하고 풀이 했다. 각각 다른 map에 담아서 서로 비교한 값이 true면 YES 아닐 경우 NO를 반환한 것인데.

강의를 듣고 나온 풀이 방법은 map하나에 먼저 input1에 대한 char array를 담는다. 그 후 input2에 대한 char array를 확인하여 key 값이 있다면 해당 value를 1씩 감소시키는 방법이다.

물론 지금 이 문제만 푼다면 solution도 괜찮은 풀이일 수 있다. 하지만 우리는 이 문제만 풀려고 해쉬를 배운게 아니기 때문에 여러 방법을 알아둘 필요가 있다. 예를 들어 랜덤한 숫자의 과녁이 있는데 소총수가 쏴서 맞히고 남은 과녁의 수를 계산해 달라는 프로그램이 있을 경우 아래 방법으로 풀어내야할 것이다.

Hash getOrDefault()를 사용하여 증가뿐만 아니라 감소를 활용하는 방법

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글