[Java알고리즘] 4-2. 아나그램(해쉬)

진주·2022년 3월 13일
0

Java알고리즘

목록 보기
8/10

🌼 Problem


🍔 Solution 1

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

public class Main {

    public static String Solution(String s1, String s2) {
        String answer = "YES";

        HashMap<Character, Integer> hm1 = new HashMap<>();
        HashMap<Character, Integer> hm2 = new HashMap<>();

        for (char c : s1.toCharArray()) {
            hm1.put(c, hm1.getOrDefault(c, 0) + 1);
        }

        for (char c : s2.toCharArray()) {
            hm2.put(c, hm2.getOrDefault(c, 0) + 1);
        }


        for (Map.Entry<Character, Integer> map1 : hm1.entrySet()) {
            for (Map.Entry<Character, Integer> map2 : hm2.entrySet()) {
                if (map1.getKey().equals(map2.getKey()) && map1.getValue() != map2.getValue()) {
                        answer = "NO";
                        break;
                }
            }
        }

        return answer;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String input1 = in.next();
        String input2 = in.next();

        Solution(input1, input2);
        System.out.println(Solution(input1, input2));
    }
}

[결과]


🍔 Solution 2

    // value를 줄이는 방식, key값이 없을때 runtime error 처리해야했다.
    public static String Solution(String s1, String s2){
        String answer = "YES";
        HashMap<Character, Integer> hm = new HashMap<>();

        for(Character ch : s1.toCharArray()){
            hm.put(ch, hm.getOrDefault(ch,0)+1);
        }
        // s2과 s1이 다르면 key값이 동일하지 않을 수 있음
        for(Character ch : s2.toCharArray()){
            if(!hm.containsKey(ch)){
                answer = "NO";
                break;
            }
            hm.put(ch, hm.get(ch)-1);

        }

        for(Integer i : hm.values()){
            if(i!=0){
                answer = "NO";
                break;
            }
        }
        return answer;
    }

🚒 issue : runtime error

   for(Character ch : s2.toCharArray()){
    	hm.put(ch, hm.get(ch)-1);
   }

s1에는 있지만, s2에는 없는 경우는 key에 해당하는 value가 존재하지 않기 때문에 hm.get(ch)-1에서 runtime error가 발생한다.


[해결방법 1]

   for(Character ch : s2.toCharArray()){
       if(!hm.containsKey(ch)){
           answer = "NO";
           break;
       }
     hm.put(ch, hm.get(ch)-1);
}

s1에 있는 key가 s2에 존재하지 않는다면 answer = "NO";로 변경 후
break를 통해 for문을 탈출한다.


[해결방법2]

   for(Character ch : s2.toCharArray()){
       hm.put(ch, hm.getOrDefault(ch,0)-1);
   }

존재하지 않는 key의 value값을 getOrDefault() 함수를 사용해서 runtime error를 방지할 수 있다.


🍪 강사 Solution

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

public class Main {

    public static String Solution(String s1, String s2){
        String answer = "YES";
        HashMap<Character,Integer> map = new HashMap<>();

        for(char x : s1.toCharArray()){
            map.put(x, map.getOrDefault(x,0)+1);
        }

        for(char x : s2.toCharArray()){
            // s2.toCharArray()했을 때, key값이 map에 없거나,
            // key값이 있는데 value가 0일수가 없으니까
            if(!map.containsKey(x) || map.get(x)==0){
                return "NO";
            }else{
                map.put(x, map.get(x)-1);
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String input1 = in.next();
        String input2 = in.next();

        System.out.println(Solution(input1, input2));

    }
}
profile
진주의 코딩일기

0개의 댓글

관련 채용 정보