[프로그래머스] 전화번호 목록.java

JoongHyuk.Velog·2022년 1월 28일

프로그래머스

목록 보기
6/7
post-thumbnail

문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
  • 각 전화번호의 길이는 1 이상 20 이하입니다.
  • 같은 전화번호가 중복해서 들어있지 않습니다.

입출력 예제

입출력 예 설명

입출력 예 #1
  • 앞에서 설명한 예와 같습니다.
입출력 예 #2
  • 한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
입출력 예 #3
  • 첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.

나의 풀이

맨 처음 Map을 사용할 생각보다는 반복문을 통해서 접두어이니깐
어떤 전화번호가 다른 전화번호로 시작하는거니깐 startsWith 함수를 사용해서 풀면 되지 않을까? 생각했다. 그렇게 풀어서 테스트 코드도 통과하길래 음~ 맞는구나~ 하고 제출을 했는데
효율성 테스트에서 빵꾸가 나버렸다... 아마 해쉬를 안써서 그렇겠지 하고 다시 고민했다..

첫번째 풀이
import java.util.*;
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        int n = phone_book.length;

        Arrays.sort(phone_book);
        
        for(int i = 0;i<n;i++){
            for(int j = i+1;j<n;j++){
                if(phone_book[j].startsWith(phone_book[i])) return false;
            }
        }
        return answer;
    }
}

그래서 생각하다가 잘 떠오르지 않아 다른 사람의 풀이를 참고했다..
나는 계속 작은길이의 전화번호를 긴전화번호에 대입해서 있는 경우를 생각했는데
map에 전화번호를 모두 넣어두고
반대로 긴 전화번호의 길이중 한글자씩 자르다가 map에 일치하는 값이 있다면 다른전화번호가 포함이 되었다는 거니깐 false를 리턴해주면 된다!

두번째 풀이
import java.util.*;
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        int len = phone_book.length;
        Map<String,Integer> map = new HashMap<>();
        
        for(int i = 0;i<len;i++){
            map.put(phone_book[i],i);
        }
        
        for(int i = 0;i<len;i++){
            for(int j = 0;j<phone_book[i].length();j++){
                if(map.containsKey(phone_book[i].substring(0,j))) return false;
            }
        }
        return answer;
    }
}

map을 사용하면 훨~씬 빠르다는걸 알게 되었고 풀이가 안된다면 반대로 생각해보는 습관도 가져봐야겠다!

profile
영차영차

0개의 댓글