알고리즘/Programmers
[프로그래머스/C++] 전화번호 목록
chaeD2
2022. 5. 18. 23:54
(5/18) - X 어엄청 오래 걸려서 풀었음
(5/19) - O
https://school.programmers.co.kr/learn/courses/30/lessons/42577
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
방법 1. binary_search
phone_book의 원소를 꺼내서, 그 원소를 substr()로 한 글자씩 조각내면서 (1234라면 1, 12, 123으로. 중복된 원소가 없다고 했으니 1234는 제외), Binary_Search()로 phone_book에 존재하는지 검사한다. phone_book의 원소 처음부터 끝까지 이렇게 검사한다.
bool solution(vector<string> phone_book) {
bool answer = true;
sort(phone_book.begin(), phone_book.end());
for (string& s : phone_book) {
int st_len = s.length();
string des = s;
for (int i = 1; i < st_len; i++) {
// des의 접두어 찾기
if (binary_search(phone_book.begin(), phone_book.end(), des.substr(0, i))) {
return false;
}
}
}
return answer;
}
방법 2. map::find
vector에 담겨 있던 phone_book을 map 컨테이너에 옮긴 다음, 1번에서 했던 것처럼 조각 낸 string들을 map::find를 통해서 찾는다.
bool solution(vector<string> phone_book) {
bool answer = true;
map<string, int> m;
for (string& s : phone_book) {
m.insert({ s, 0 });
}
for (auto& p : m) {
int len = p.first.length();
for (int i = 1; i < len; i++) {
if (m.find(p.first.substr(0, i)) != m.end()) {
return false;
}
}
}
return answer;
}
결론
모든 테스트 케이스에서 속도와 메모리 차이가 크지 않았다. 그런데 효율성 테스트 3, 4번에서 map::find가 속도와 메모리 측면에서 조금 더 비효율적이었다.