전화번호 목록

magicdrill·2025년 4월 7일
0

전화번호 목록

문자열 정렬은 사전순으로 정렬됨을 까먹고, compare 함수를 만들어서 길이순으로 정렬했다. 사실 사전순으로 정렬하면 길이 상관 없이 바로 다음 문자열이 현재 문자열을 접두어로 포함하는지 확인만 하면 되서 효율성을 올릴 수 있다.

또한 첫 풀이에서 substr()를 사용해 각 문자열을 비교했지만, 이후 find() 함수를 사용했다.

문자열B.find(문자열A | 문자A) : 처음부터 탐색
문자열B.rfind(문자열A | 문자A) : 뒤에서부터 탐색
문자열B.find("문자열A | 문자A", 5) : 인덱스 5부터 탐색

  • 문자열B에서 문자열A 또는 문자A의 위치 인덱스를 찾아서 반환한다. 찾지 못하면 -1을 반환한다.


    phone_book[i + 1].find(phone_book[i]) == 0 : 탐색 결과가 0이면 phone_book[i]phone_book[i + 1]의 접두어이다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

bool solution(vector<string> phone_book) {
    bool answer = true;
    int i, j;
    //string current_str, compare_str;
    
    sort(phone_book.begin(), phone_book.end());//사전 순 정렬
    for(string temp : phone_book){
        cout << temp << " ";
    }
    cout << "\n";
    
    for(i = 0; i < phone_book.size() - 1; i++){
        // current_str = phone_book[i];
        // for(j = i + 1; j < phone_book.size(); j++){
        //     compare_str = phone_book[j];
        //     if(compare_str.substr(0, current_str.size()) == current_str){
        //         //cout << current_str << "은 " << compare_str << "의 접두어\n";
        //         return false;
        //     }
        // }
        
        if (phone_book[i + 1].find(phone_book[i]) == 0) {
            cout << phone_book[i] << "은 " << phone_book[i + 1] << "의 접두어\n";
            return false;
        }
    }
    
    return answer;
}

0개의 댓글