티스토리 뷰
인덱스 접근 오류가 몇번 나서 고치는 것 말고는
문제 이해도 쉽고 풀기에도 어렵지 않았던 문제다.
다른 사람의 풀이를 보던 중, 나와 너무 다르고 쉽게 접근한 것을 발견했다.
그리고 문제 자체가 해시에 분류되어 있는 만큼 해시를 이용해 푼 풀이도 있었다.
그래서 정리를 해보려고한다.
<문제>
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 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을 사용하여 해시를 사용했다.
문자를 하나하나 받아가면서 비교를 했다.
이게 이 문제에서 원하는 풀이일지도 모른다.
'CS > Algorithm' 카테고리의 다른 글
[ 프로그래머스 ] N개의 최소공배수 (0) | 2021.01.21 |
---|---|
[ 프로그래머스 ] 위장 ( C++ ) (0) | 2021.01.16 |
[ 프로그래머스 ] 소수 찾기 ( C++ ) (0) | 2021.01.12 |
[ 프로그래머스 ] 비밀 지도 - 2018 카카오 채용 1차 ( C++ ) (0) | 2021.01.11 |
[ 프로그래머스 ] 멀쩡한 사각형 (C++) (0) | 2020.12.29 |