프로그래머스 - 전화번호 목록

phoenixKim·2021년 8월 12일
0

풀이 전략

  • phone_book이라는 컨테이너에 전화번호를 저장 , 중복 처리 안됨.

  • 문제를 보면 접두어가 다른 목록에 있다면 false를 리턴하고,
    만약에 다른 목록 중에 접두어가 없다면 true라고 한다.

=> 찾는 문제다. 그리고 제한사항으로 phone_book에는 1 ~ 100만 까지이므로 탐색이 빠른 unoreder_set이나 set으로 풀어야 겠다고 생각함.

실제 풀이 전략
1. 일단 set에다가 모든 목록을 넣자.
2. 그리고 목록 한개의 접두어 vs 목록 전체를 탐색하면서
확인을 할것이다.
-> 여기서 중요한 점이 target으로 잡은 접두어 인덱스 0번부터 마지막 까지 기준을 잡아야 하므로
target 값은 [0] ~ <[length] 까지 진행해야 한다는 것을
캐치해 내야한다.
3. target 값은 누적하면서 임시 string에다가 저장하면서 find해나감
4. 예외 처리로는 자기 자신을 find 할수 있으므로 예외처리하자.

소스코드

#include <string>
#include <vector>
#include <set>
using namespace std;

bool solution(vector<string> phone_book) {
    bool answer = true;
    
    set<string>number;
    
    for(const auto &i : phone_book)
        number.insert(i);
    
    //발견하면 false
    //자기 자신은 건너뛰어야 한다. 
    for(int i = 0; i < phone_book.size(); i++)
    {
        string word = "";
        
        for(int j = 0; j < phone_book[i].length(); j++)
        {            
            word += phone_book[i][j];
            if(word == phone_book[i])
                continue;
            
            if(number.find(word) != number.end())
                return false;           
        }
    }
    
    return answer;
}
  • set으로 풀면

  • unordered_set으로 풀면

=> 효율성 테스트 케이스 1,2,3,4에서 반절이상으로 시간이 모두 줄어든것을 확인할 수 있다!

profile
🔥🔥🔥

0개의 댓글

관련 채용 정보