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

2022. 8. 9. 15:41코딩 공부 연습

반응형

어허.. 오랜만에 레벨2를 풀었다.

맨첨에 시간을 신경쓰지않고 일단 푼다음에 시간을 줄여보자는 생각으로 2중for문을 갈겼다. 다 통과가 되는줄알았는데 효율성검사를 하는지 몰랐네.. 효율성 검사에서 틀렸다고 떴당ㅋㅋ

 

틀린코드는 다음과 같다.

#include <string>
#include <vector>
#include <iostream>
#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(); i++)
    {
        for(int j = 0; j < phone_book.size(); j++)
        {
            if (phone_book[j].find(phone_book[i]) == 0 && i != j)
                return false;
        }
    }
        
    return true;
}

사실 저거 전에 문자열의 길이가 더 긴 애를 짧은애와 비교할 필요가 없어서 sort를 저거로 안하고 따로 길이순으로 정렬하는걸 만들어서 비교하는 시간을 좀 더 줄여보려고 했다. 

 고치려고 생각을 하다 문자열 길이로 할게 아니라 그냥 정렬해서 알파벳 순으로만 정렬한다해도 원하는 대로 비교할 수 있다는 걸 알게 되었다. 그래서 그냥 stl  sort로 정렬하고 비교를 find로 했다. 이거 strncmp 같은 거가 string 에 있는지 모르겠는데 사용법을..몰라서 그냥 Find 로 찾은 위치가 0 이면 첫번째에 접두사로 있다는 의미가 되니까 이렇게 찾았다..! 더 찾아봐야재

 

#include <string>
#include <vector>
#include <iostream>
#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+1].find(phone_book[i]) == 0)
            return false;
    }
        
    return true;
}

이걸로 하면 효율성 검사도 통과한다! skrrrrkak