티스토리 뷰

반응형

인덱스 접근 오류가 몇번 나서 고치는 것 말고는

문제 이해도 쉽고 풀기에도 어렵지 않았던 문제다.

다른 사람의 풀이를 보던 중, 나와 너무 다르고 쉽게 접근한 것을 발견했다.

그리고 문제 자체가 해시에 분류되어 있는 만큼 해시를 이용해 푼 풀이도 있었다.

그래서 정리를 해보려고한다. 

 

<문제>

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

  • 구조대 : 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입니다.

 

 

 

<내 풀이>

#include <string>
#include <vector>

using namespace std;

bool solution(vector<string> phone_book) {
    string s = phone_book[0];
    int n = phone_book[0].size(), i = 0, j = 1;

    while(true) {
        if (i!=j && phone_book[j].size() >= n && s == phone_book[j].substr(0, n)) 
            return false;
        if (j == phone_book.size() - 1) {
            if(i+1 == phone_book.size()) break;
            i++;
            j = -1;
            s = phone_book[i];
            n = s.size();
        }
        j++;
    }
    return true;
}

phone_book의 원소 하나를 기준을 정한 후, 0부터 끝까지 접두어가 될 수 있는지 비교한다.

끝까지 비교한 후 기준이 되는 원소 인덱스 또한 끝까지 늘려간다.

이 때 substr를 이용했다. 사실상 이중 for문이나 마찬가지이며 단순히 모든 원소와 비교한다.

 

 

 

<다른 사람의 풀이>

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

using namespace std;

bool solution(vector<string> phone_book) {
    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 true;
}

phone_book 벡터의 데이터 타입이 string이기 때문에 sort(정렬)을 할 경우

숫자 순으로 정렬이 되는것이 아니라 사전 순 정렬이 된다. 이 점을 생각한 것이 놀라웠다 ! 😨

사전 순으로 정렬을 하기 때문에 인접 원소만 비교를 하면 된다.

 

 

 

위 풀이 말고 해시 풀이도 정리하려한다.

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

using namespace std;

bool solution(vector<string> phone_book) {
    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])
                return false;
        }
    }
    return true;
}

unordered_map을 사용하여 해시를 사용했다.

문자를 하나하나 받아가면서 비교를 했다.

이게 이 문제에서 원하는 풀이일지도 모른다.

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday