바야바네 움집

[프로그래머스] 전화번호 목록 본문

🧶 알고리즘/🎲프로그래머스Programmers

[프로그래머스] 전화번호 목록

친절한 바야바 2021. 11. 17. 22:20

 

< 문제설명 >

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 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입니다.

 

 

 

< 생각해낸 풀이 방법 >

  1. 정렬 후,
  2. 맨 앞 원소부터 마지막 원소까지 비교한다.

그러나 실패!

 

 

< 실패의 원인 >

  1. 비교당할 문자열을 비교할 문자열만큼 잘라내는 방법을 생각하지 못했다. 그냥 '잘라낸다'는 개념을 생각하지 못했다.

 

 

< 정답 >

답을 찾아보면서 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
Comments