본문 바로가기

c++/프로그래머스

프로그래머스 : 전화번호 목록 C++

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

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

programmers.co.kr

 

아래 블로그를 보고 참고를 조금 했다.

https://velog.io/@redgem92/C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level-2-%EC%A0%84%ED%99%94%EB%B2%88%ED%98%B8-%EB%AA%A9%EB%A1%9D

String을 사용한다는 점을 활용해서 sort하는거에서 감탄했다

 

문자열 비교 로직
1. 동일한 위치(인덱스)의 문자와 비교했을 때 다를 경우, ASCII 코드 값을 기준으로 비교(ex. 'A' < 'B')
2. 서로 길이가 다를 경우, 앞에서 부터 시작해서 같은 부분이 있는 경우 길이가 짧은 순(ex. "12" < "123")

 

이 로직이 사용되기 때문에 바로 이전 string과 비교만 하면 되게 된다.

 

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool solution(vector<string> phone_book) 
{
    // 예외 처리
    if(phone_book.size() <= 1)
        return true;

    sort(phone_book.begin(), phone_book.end());

    // 이전 전화번호의 접두어일 경우 false!
    for(int i = 1; i < phone_book.size(); i++)
    {
        if(phone_book[i].find( phone_book[i - 1]) == 0)
            return false;
    }

    return true;
}