프로그래머스/Level_2

[Level_2] 전화번호 목록 (C++)

배발자 2022. 1. 13.
반응형

 

생각 보다 쉬운 문제였다. 

여기서 중요한점은 먼저 사전순으로 정렬을 해야한다. 

먼저 5개의 임의의 문자열을 상상해보자

 

"aabbc", "bab", "a", "baz", "babcc" 

 

5개의 문자열을 파라미터로 받아왔다고 가정하자. 해당 문자열을 정렬 시키면 

 

"a"

"aabbc"

"bab"

"babcc"

"baz" 

 

이런식으로 정렬하게 되는데 해당 벡터를 두번째부터 시작을 하여 벡터의 사이즈-1 까지 search 한다. 

search 하면서 이전의 벡터의 문자열이 현재 벡터값에서 find해서 있으면 false 없으면 true 로 반환하면 된다. 

 

여기서 find() 함수를 모르는 분도 계실 수 있으니 잠깐 설명한다. 

 

s1.find(s2) : s1 문자열에 s2 문자열이 있으면 시작 인덱스를 반환. 

 

즉, "babcc" 문자열에 "bab" 문자열이 있다면 해당 시작 인덱스 번호를 반환해라. 라는 뜻이다. 

 

다시말해서 사전순으로 정렬했기 때문에 현재 문자열 안에 바로 이전 문자열이 포함한다면

항상 앞쪽부터 시작한다. 그렇기 때문에 이전 값만 비교하면 되고 해당 인덱스 번호는 항상 맨 앞쪽부터 일테니 0을 반환한다는 뜻이다. 

 

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

using namespace std;

bool solution(vector<string> phone_book) {
    vector <string> v = phone_book;     
    sort(v.begin(), v.end()); 
    for(int i=1; i<v.size(); i++){
        if(v[i].find(v[i-1])==0)return false;
    }
    return true;
}

* vector <string> v = phone_book 을 한 이유는 이후에 phone_book 이라는 변수 짧게 쓰고싶어서..

반응형

댓글