바야바네 움집
[프로그래머스] 전화번호 목록 본문
< 문제설명 >
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 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입니다.
< 생각해낸 풀이 방법 >
- 정렬 후,
- 맨 앞 원소부터 마지막 원소까지 비교한다.
그러나 실패!
< 실패의 원인 >
- 비교당할 문자열을 비교할 문자열만큼 잘라내는 방법을 생각하지 못했다. 그냥 '잘라낸다'는 개념을 생각하지 못했다.
< 정답 >
답을 찾아보면서 substr() 이라는 함수를 사용하면 된다는 것을 알게 되었다.
- substr() 의 원형
string substr(size_t index = 0, size_t len = npos) const;
이 함수는 자신을 호출한 string 객체의 입력 받은 index 부터 len 만큼을 잘라내 반환하는 용도로 쓰인다. 이 때 len 에 디폴트로 할당되어 있는 npos 는 -1을 의미하고, size_t의 타입은 unsigned int 타입이기 때문에 len을 입력해주지 않았을 시에는 '언더플로우'에 해당되어 최고값을 갖게 된다. 즉, index부터 마지막 원소까지 잘라낸다는 소리다.
출처 : https://blockdmask.tistory.com/338
- 코드
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;
}
'🧶 알고리즘 > 🎲프로그래머스Programmers' 카테고리의 다른 글
[Level1] 예산 (0) | 2021.11.20 |
---|---|
[Level1] 모의고사 (0) | 2021.11.19 |
[프로그래머스] 위장 (0) | 2021.11.17 |