문제 풀이
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
bool solution(vector<string> phone_book) {
bool answer = true;
// 배열을 정렬. string 형태이므로 크기순이 아닌 사전순으로 정렬된다.
sort(phone_book.begin(), phone_book.end());
// 맨 앞의 원소를 접두어로 삼는다
string chk = phone_book[0];
for (int i = 1; i < phone_book.size(); i++) {
if (phone_book[i].substr(0, chk.size()) == chk)
answer = false;
}
return answer;
}
이렇게 풀어도 전부 통과가 나오는데, 가만 생각해보면 {"12", "23", "234"} 등의 배열과 같이 첫 번째 원소가 아니라 그 이후의 원소가 접두어가 되는 경우가 생길 수 있다.
해서 다른 사람들이 푼 코드를 보면
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
bool solution(vector<string> phoneBook) {
bool answer = true;
sort(phoneBook.begin(), phoneBook.end());
for (int i = 0; i < phoneBook.size() - 1; i++ ) {
if ( phoneBook[i] == phoneBook[i+1].substr(0, phoneBook[i].size())) {
answer = false;
break;
}
}
return answer;
}
이처럼 맨 앞을 기점삼는 것이 아니라 맨 앞부터 2개씩 쌍을 묶어 비교하는 방법을 사용하고 있음을 할 수 있다. 이것이 가능한 이유는 phoneBook 배열이 숫자가 아닌 문자열로 이루어져 있기 때문이다. 크기가 아닌 사전순으로 정렬되기 때문.
문제 링크
programmers.co.kr/learn/courses/30/lessons/42577programmers.co.kr/learn/courses/30/lessons/42577?language=cpp
코딩테스트 연습 - 전화번호 목록
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조
programmers.co.kr
'C++ > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [C++] 기능개발 (0) | 2020.11.23 |
---|---|
[프로그래머스] [C++] 주식가격 (0) | 2020.11.19 |
[프로그래머스] [C++] 베스트앨범 (0) | 2020.11.19 |
[프로그래머스] [C++] 위장 (0) | 2020.11.19 |
[프로그래머스] [C++] 완주하지 못한 선수 (0) | 2020.11.18 |