programmers : https://programmers.co.kr/learn/courses/30/parts/12077

 

programmers 해시 level2 전화번호목록 문제입니다.

 

전체스트링 하나가 다른 스트링의 접두사가 되는 부분이 있는지 확인하는 문제입니다.

 

******

사실 이 문제는 .. 테스트케이스가 좀 부족한 문제이지 않나 싶습니다.

O(N^2) 코드가 O(N+NlogN) 코드보다 빠르게 정말 더빠르게 해결됨을 확인했습니다.

아마 N^2 의 완탐코드에서 정답이 빨리 찾아지는 테스트케이스만 모여있기 때문이 아닐까 추측해봅니다

******

 

예를 들어 

12 13 124 2 52 라는 값이 있으면

12 가 124의 접두사가 되기 때문에 정답이 false 가 됩니다.

 

이 문제는 범위가 100만 이기 때문에 사실 N^2 의 복잡도로는 문제가 해결되지 않을줄 알았습니다.

다음은 O(N^2) 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <string>
#include <vector>
 
using namespace std;
 
bool solution(vector<string> phone_book) {
    bool answer = true;
    
    for(int i = 0; i<phone_book.size()-1; i++){
        for(int j = 0; j<phone_book.size(); j++){
            if(phone_book[i].size()>phone_book[j].size() || i==j) continue;
            bool temp = true;
            for(int k = 0; k<phone_book[i].size(); k++){
                if(phone_book[i][k] != phone_book[j][k]){
                    temp = false;
                    break;
                }
            }
            if(temp){
                answer = false;
                break;
            }
        }
        if(!answer) break;
    }
    
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

그런데 빠른시간내로 통과되더라구요? ??.. 

하지만 문제를 이런식으로 풀게 되면 분명 TLE를 받게될 경우들이 많아질 것이 분명합니다..

 

접두사를 좀더 빠르게 찾는 방법이 무엇일까요?

답은 정렬입니다.

위의 12 13 124 2 3 을 정렬하면

12 124 13 2 3 이라는 사전순서의 정렬이 됩니다.

 

그리고 O(N)으로 문제를 해결하면 됩니다.

접두사가 있는지 없는지는 현재위치와 다음위치만 비교해주면 되기 때문입니다.

다음은 정렬을 이용한 O(N)+O(NlogN) 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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()))
        {
            answer = false;
            break;
        }
    }
 
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > programmers' 카테고리의 다른 글

Programmers 라면공장(C++)  (0) 2020.07.02
programmers N으로 표현  (0) 2020.03.12
programmers H-Index C++  (0) 2020.03.10
programmers 가장 큰 수  (0) 2020.03.10
programmers K번째수  (0) 2020.03.10

+ Recent posts