본문 바로가기
항해

[DAY37] JAVA프로그래머스 전화번호 목록

by neVerThe1ess 2024. 12. 17.

https://school.programmers.co.kr/learn/courses/30/lessons/42577

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

전화번호 목록 문제가 '해시' 문제로 분류 되어 있지만 풀 수 있는 방식이 다양하다.

1. sort 정렬방식

2. hash 방식

더 간편하고 쉬운것은 sort 지만 왠지 정석대로 hash로도 풀고 싶었다...


🌘 문제 이해하기 

  • 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인
  • 접두어란 단어에 붙은 글자의 조합

🌗문제 자세히보기

①  sort 방식

  • String 문자열을 정렬하면 9 , 12 , 1 가 1  , 12 , 9  실제로 숫자의 크기가 아니라 한글자 씩  숫자들의 순서대로 정렬이된다. 
  • phone_book 을 정렬하고 앞뒤로 비교한다. 뒤에 문자열이 앞에 문자열로(접두어) 시작하는지 확인한다.

 

② hash 방식

  • HashMap에 전화번호를 key 값으로 저장한다. (value 는 의미 없음)
  • map에 저장되어 있는 한 번호를 한글자씩 추가해서 접두어를 만든다.
  • 해당 접두어가 map에 포함되어있는 key 인지 확인한다.

🌕 최종코드 

public  boolean solution(String[] phone_book) {
        boolean answer = true;

        Arrays.sort(phone_book);

        for(int i=0;i<phone_book.length-1;i++) //기준값
        {   
            if(phone_book[i+1].startsWith(phone_book[i]))
                {                   
                    return false;
                }
        }
        return answer;
    }

    public  boolean solution2(String[] phone_book) {
       
        HashMap<String,Integer> map = new HashMap<>();

        for(int i=0;i<phone_book.length;i++)
        {
            map.put(phone_book[i], i);
        }

        for(int i=0;i<phone_book.length;i++)
        {
            String phone = phone_book[i];

            for(int j=0;j<phone.length();j++)
            {
                if(map.containsKey(phone.substring(0,j)))
                {
                    return false;
                }
            }            
        }

        return true;
    }