ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 > 해시 > 전화번호부
    기타/알고리즘 2021. 7. 22. 16:32

    전화번호부 리스트에 있는 번호 중 다른 번호의 접두어가 되는 전화번호가 있는지 유무

     

    처음에 번호의 길이를 짧은 순으로 정렬한 후 다른 긴 번호를 그 길이만큼 잘라서 검사하려고 했는데, 

    효율성 테스트를 계속 통과하지 못했다. 

    근데 코드를 이리저리 바꿔보면 코드 자체가 통과하지 못했다.

    import java.util.Arrays;
    import java.util.Comparator;
    
    
    // 효율성 테스트 3,4 번 통과 못함
    class Solution {
        public boolean solution(String[] phone_book) {
           Arrays.sort(phone_book,Comparator.comparing(String::length));
            
            for(int i=0;i<phone_book.length-1;i++) {
                for(int j=i+1;j<phone_book.length;j++) {
                  int len = phone_book[i].length();
                  if(phone_book[j].substring(0, len).equals(phone_book[i])) return false;
                }
            }
            
        }
    }

     

    알고보니 처음에 Array.sort 의 기준을 문자열의 길이값으로 한 게 문제였다.

    길이가 아닌 그냥 sort 를 하면 문자열의 아스키 값으로 정렬이 된다.

    그럼 앞에 동일 문자로 시작하는 번호는 동일 아스키 값으로 변경된다.

     

    class Solution {
        public boolean solution(String[] phone_book) {
          Arrays.sort(phone_book); //아스키값 기준으로 정렬    
          //String [] arr = {"1195524421","119", "97674223" };  
          // =>  {"119","1195524421", "97674223" };=> 
          // 아스키 {"494957", "49495753535052525049","5755545552505051"}
            
            for(int i=0;i<phone_book.length-1;i++) {
                for(int j=i+1;j<phone_book.length;j++) {
                  int len = phone_book[i].length();
                  if(phone_book[j].substring(0, len).equals(phone_book[i])) return false;
                }
            }
            
        }
    }
    반응형
Designed by Tistory.