문제 URL
https://school.programmers.co.kr/learn/courses/30/lessons/42577
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제 설명]
다음 문제는 전화번호부에 적힌 전화번호를 담은 배열 phone_book이 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 하는 함수를 작성하는 문제이다.

[문제 풀이]
이 문제는 단순히 phone_book 배열의 문자열들을 비교하면 됐는데, 한 문자열의 substring이 다른 문자열과 같다면 false를 return하고 그렇지 않다면 true를 return하면 됐다.
[다른 방식]
단순히 문자열을 substring으로 잘라 비교하는 방식 말고도 해시맵을 사용하여 이 문제를 풀 수도 있었다.
이는 검색을 통해 알아봤는데 본인은 아직은 해시맵 구현이 어렵다고 느꼈다. 하지만 코드 이해가 어려웠던 건 아니므로 구현 연습을 열심히 해야겠다고 느낀다.
// substring으로 잘라 문자열을 비교하는 방식
#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())){
return answer = false;
}
}
return answer;
}
// hash map을 이용하여 비교하는 방법
#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_num = "";
for(int j=0; j<phone_book[i].size(); j++) {
phone_num += phone_book[i][j];
if(hash_map[phone_num] && phone_num != phone_book[i])
return false;
}
}
return true;
}