프로그래머스/코딩테스트

해시 - Lv2 전화번호 목록

tunta 2023. 10. 19. 17:29
반응형

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

구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

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

 

입출력 예제

phone_book  return
["119", "97674223", "1195524421"] false
["123","456","789"] true
["12","123","1235","567","88"] false

입출력 예 설명
입출력 예 #1
앞에서 설명한 예와 같습니다.

입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.

 

처음에는 일반적인 방식으로 확인을 했는데

class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        for(String phone_num: phone_book){
            for(String comp : phone_book){
                if(phone_num.length() < comp.length()){
                    if(comp.indexOf(phone_num) == 0)
                        return false;
                }
            }
        }
        return answer;
    }
}

해당 코드로 실행을 시켜보니 일반적인 경우에서는 다 통과를 했는데 효율성 테스트에서 문제가 발생했다.

케이스가 많아 질수록 비교 해야하는 경우의수가 많아 지면서 지연 시간이 많이 발생하기 때문에 효율성 테스트에서 문제가 발생한것으로 생각된다.

 

그렇기 때문에 제외할수 있는 케이스들을 생각해보니

  • 정렬을 하는 경우 앞에서부터 정렬이 되기 때문에 랜덤으로 제공되는 번호에 대한 규칙이 발생하기 때문에 구분하기 편해진다는것
  • 같은 번호가 없다는 가정이 있다보니 길이가 같은 경우는 절대 같은 수가 될수가 없다는 것
  • 본인을 비교할 이유가 없음

위의 두가지의 케이스를 고려해서 다시 한번 고친 코드가 아래의 코드

import java.util.*;
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        Arrays.sort(phone_book);
        for(int i=0; i<phone_book.length; i++){
            for(int j=i+1; j<phone_book.length; j++){
                if(phone_book[i].length() >= phone_book[j].length())
                    break;
                if(phone_book[j].indexOf(phone_book[i]) == 0){
                    return false;
                }
            }
        }
        return answer;
    }
}

해당 코드로 테스트는 통과했습니다.

다른 사람의 풀이로 보니 여러 방법으로 효율을 극대화 시키는 방식이 있을것 같아 보이네요.

반응형