[해시] 전화번호 목록

hanturtle·2020년 8월 5일
0

programmers

목록 보기
9/28

문제

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
  • 각 전화번호의 길이는 1 이상 20 이하입니다.


풀이


전화번호부를 정렬하고 간단하게 for문 돌리면 될것같다.
근데 이렇게 작성하면 시간초과 걸릴것같은데..
우선한번 해보겠다!

bool solution(vector<string> phone_book) {
    bool answer = true;
    sort(phone_book.begin(), phone_book.end());
    
    for(int i=0;i<phone_book.size();i++){
        for(int j=i+1;j<phone_book.size();j++){
            if(phone_book.at(j).find(phone_book.at(i))!= string::npos){
                answer = false;
                break;
                break;
            }
        }
    }
    return answer;
}



역시나 test case는 다 통과하지만 효율성부분에서 다 시간초과가 뜬다.
아! 접두어인 경우구나-!!!나는 123,4512368인 경우 후자에 123이 포함되어있는 경우 역시 false를 해버렸다. 그렇다면 find가 아니라 substr을 사용해야겠다.

bool solution(vector<string> phone_book) {
    bool answer = true;
    sort(phone_book.begin(), phone_book.end());
    
    for(int i=0;i<phone_book.size()-1;i++){
        for(int j=i+1;j<phone_book.size();j++){
            if(phone_book.at(j).substr(0,phone_book.front().length()) == phone_book.at(i)){
                
                answer = false;
                break;
                break;
            }
        }
    }
    return answer;
}
아 또 시간초과,,생각해보니 이게 정수가 아니라 문자열이라 이중포문아니라 바로 조건문해주면됨. 바보😳
bool solution(vector<string> phone_book) {
    bool answer = true;
    sort(phone_book.begin(), phone_book.end());
    
    for(int i=0;i<phone_book.size()-1;i++){
            if(phone_book.at(i+1).substr(0,phone_book.front().length()) == phone_book.at(i)){
                
                answer = false;
                break;
            }
        }
    return answer;
}




아무쪼록 성공!!

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
profile
야무지게 행복하세요😘

0개의 댓글