본문 바로가기

Algorithm/프로그래머스

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

반응형

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


- 문제

  주어진 전화번호가 다른 전화번호의 접두어인 경우 false를 아니면 true를 반환하는 문제이다.

 

특이하게 해시로 풀어야 하는 문제에 속한다.

 


- 풀이

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

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[i] == phone_book[i+1].substr(0,phone_book[i].size()))
            return false;
    }
    
    return answer;
}

 

 

sort를 해서 사전순으로 정렬했으니 다음 전화번호랑만 비교하면 된다.

 

근데 해시를 이용해서 풀어야 하는 문젠데, 아무리 생각해도 해시로 어떻게 풀어야 할 지 모르겠어서 다른 사람꺼를 참고해봐야겠다.

 

 

#include <string>
#include <vector>
#include <unordered_map>

using namespace std;

bool solution(vector<string> phone_book) {
    bool answer = true;

    unordered_map<string, int> hash_map;
    for(int i = 0; i < phone_book.size(); i++)
        hash_map[phone_book[i]] = 1;

    for(int i = 0; i < phone_book.size(); i++) {
        string phone_number = "";
        for(int j = 0; j < phone_book[i].size(); j++) {
            phone_number += phone_book[i][j];
            if(hash_map[phone_number] && phone_number != phone_book[i])
                answer = false;
        }
    }

    return answer;
}

 

 

해시로 하나하나 모두 만든 다음에 반복문을 이중으로 돌려서 하라는 문제였던 것 같은데, 그렇게 좋아 보이지는 않는다.

 

 

  


- 기억할 것!

 X

반응형