Algorithms

Java 알고리즘 아나그램(해쉬) 풀이

빈코 2023. 2. 16. 14:11

오늘은 해쉬맵을 이용하여 주어지는 두 단어가 아나그램인지 판별하는 문제를 풀어보려고 합니다. 아나그램은 두 단어가 알파벳 나열 순서가 달라고 구성이 같을 때의 경우를 의미합니다😀

로고
아나그램

 

개요

문제 내용
문제 내용
문제 예시
문제 예시

 

이번 문제의 핵심은 서두에서 언급했듯이 해쉬맵의 기능들을 사용하는 것이 될 것 같네요😊

 

Setting📙

public class Anagram {
    public static void main(String[] args) {
        Anagram T = new Anagram();
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String b = sc.next();
        System.out.println(T.solution(a,b));
    }
}

입력값은 문제에 나와있는 것 처럼 두 단어가 주어집니다. Scanner를 이용하여 a,b 변수로 단어를 받고 solution 함수에 넘겨주기만 하면 세팅은 끝이 납니다.

 

Solution📘

public class Anagram {
// main..
    public String solution(String a, String b){
        String result = "YES";
        HashMap<Character, Integer> map = new HashMap<>();
        for (char c : a.toCharArray()) {
            map.put(c, map.getOrDefault(c,0) + 1);
        }
        for (char x : b.toCharArray()) {
            if(!map.containsKey(x) || map.get(x) == 0) {
                return "NO";
            }
            map.put(x, map.get(x) -1);
        }
        return result;
    }
}

solution 함수에서는 처음에 리턴 시켜줄 result 변수를 "YES"로 선언합니다. 이후에 HashMap을 선언하는데, 맵에는 키 값으로 한글자씩 들어가고 개수를 세기 때문에 Character, Integer로 선언합니다. 

 

forEach문을 이용하여 첫 번째 단어인 a를 반복문을 돌면서 맵에 넣어주는데, toCharArray()는 String 변수를 Character 배열 형식으로 만들어줍니다. 또한, getOrDefault 함수는 map에서 제공해주는 기능입니다.

 

map.get(키 값)은 해당 map에서 키를 통해 value를 가져오는데, getOrDefault는 map에 해당 키가 없을 때, 뒤에 선언한 인자로 기본값을 가져옵니다. 위에서는 단어에 처음 등장하는 알파벳을 넣기 위해서 0으로 선언한 뒤 +1을 해주는 형식으로 처리하였습니다.

 

첫 번째 반복문을 통해 map에는 현재 a:1, A:2, b:1, C:1, e:2의 키 밸류 형식으로 들어가 있습니다. 이제 다음 단어인 b를 똑같이 탐색하면서 밸류값을 줄여주면 됩니다.

 

처음 if 조건문에는 containsKey(키 값) 함수를 볼 수 있는데, 이 함수는 해당 map이 키 값을 가지고 있는지 판단합니다. 만약 map에 b의 알파벳이 없다면 아나그램이 아니기 때문에 return "NO"를 해줍니다. 마찬가지로, map.get(키 값)을 이용하여 해당 밸류가 0이면 NO를 리턴합니다. 이유는 키 값에 대응하는 밸류값이 서로 다르다는 뜻이기 때문입니다.

 

조건문 아래는 탐색되는 알파벳으로 map의 밸류를 가져온 뒤에 하나씩 차감하는 로직입니다.

 

Result📗

결과
테스트 결과

 

 


👨‍👩‍👦‍👦 오픈채팅방 운영

취업을 준비하는 예비 개발자분들을 위한 질문&답변할 수 있는 공간을 만들었습니다. 취업과 이직을 하기 위해서 어떤 걸 중점적으로 준비해야 하는지부터 포트폴리오&이력서 작성법 등 다양한 질문들을 받고 답변을 드립니다. 참여하셔서 다양한 정보 얻고 가시면 좋을 것 같네요😁

 

참여코드 : 456456

https://open.kakao.com/o/gVHZP8dg

 

비전공 개발자 취업 준비방(질문&답변)

#비전공 #개발자 #취업 #멘토링 #부트캠프 #국비지원 #백엔드 #프론트엔드 #중소기업 #중견기업 #자바 #Java #sql

open.kakao.com

 


👨‍💻 전자책 출간

아울러 제가  🌟비전공자에서 2년만에 보안 전문 중견기업으로 이직 한 방법들을 정리한 전자책을 출간 하게 되었습니다. 어떤 걸 공부해야 하는지, 이직을 위해서 무엇을 준비해야 하는지, 제가 받았던 기술 면접 리스트 등 다양한 목차로 구성되어 있습니다. 또한, 구매 시 1:1 채팅을 이용하여 포트폴리오 첨삭을 도와드리고 있습니다. 🐕전자책으로 얻은 모든 수익은 유기견 센터 '팅*벨 입양센터'에 후원될 예정입니다. 관심 있으신 분들은 아래 링크를 참고해주세요😁

https://kmong.com/gig/480954

 

비전공개발자 2년만에 중견기업 들어간 방법 | 14000원부터 시작 가능한 총 평점 0점의 전자책, 취

0개 총 작업 개수 완료한 총 평점 0점인 Binco의 전자책, 취업·이직 전자책 서비스를 0개의 리뷰와 함께 확인해 보세요. 전자책, 취업·이직 전자책 제공 등 14000원부터 시작 가능한 서비스

kmong.com


 

마치며

지금까지 해쉬맵을 이용하여 아나그램을 판별하는 문제를 풀어보았습니다. 다음 포스팅은 이번 문제보다 심화된 모든 아나그램을 찾는 문제를 포스팅하겠습니다😊

반응형