[ 백준 5052 ] 전화번호 목록 (C++)

2024. 3. 8. 18:43· 문제풀이/알고리즘 문제 풀이
목차
  1. 🔗 문제 링크
  2. 💡 문제 접근
  3. 💡 문제 풀이 및 해석
  4. ⭐️ 정답 코드 및 설명
  5. 🤔 문제 후기
728x90

🔗 문제 링크

https://www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가

www.acmicpc.net


💡 문제 접근

가장 먼저 접두사를 어떤 순서로 검사할지 정해야 하는데, 여기서 문제는 이 기준을 어떻게 정할 것인지다. 일단, 최소한 길이가 긴 전화번호가 짧은 전화번호의 접두사가 될 일은 없는데, 이런 방식으로 풀면 뒤의 모든 전화번호들을 검사해야 되기 때문에, 시간초과가 났다. 여기서 정렬을 하면서 힌트를 얻은 것이 있는데, string을 정렬하면 [123,234,13,12999] 가 있다면, [123,12999,13,234] 순으로 정렬된다는 것이다. 여기서 123 -> 12999 일 때, 맨 앞자리 -> 그 다음자리 이런 순으로 정렬된다는 것을 알 수 있는데, 이러면 자연스럽게 0123456789 순으로 나열이 된다. 따라서 현재의 전화번호와 그 뒤의 전화번호만 비교해줘도 모든 접두사를 비교할 수 있는 것이다.


💡 문제 풀이 및 해석

  1. 모든 전화번호를 string으로 받은 다음에 오름차순으로 정렬한다.
  2. 정렬된 전화번호들을 "현재 전화번호"와 "다음 전화번호"로 비교한다.
  3. 현재 전화번호의 길이가 다음 전화번호의 길이보다 크거나 같으면, 비교할 필요가 없다.
    ex) cur = 12345, next = 124 이면, 어차피 번호가 3에서 4로 넘어가기 때문에, 접두사가 될 수 없다. 그리고 같은 번호는 없으니 cur = 123, next = 123인 경우도 없다.
  4. next 전화번호를 cur 전화번호의 길이만큼 잘라서 접두사인지 비교해보고 같다면, NO를 출력하고 비교를 멈춘다.
  5. 모든 비교를 해도 접두사가 없다면 YES를 출력한다.

⭐️ 정답 코드 및 설명

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int n, t;

vector<string> init() {
    cin >> n;
    vector<string> numberBook(n);
    for (int i = 0; i < n; i++) {
        cin >> numberBook[i];
    }
    sort(numberBook.begin(), numberBook.end());
    return numberBook;
}

void sol(vector<string> numBook) {

    for (int i = 0; i < n - 1; i++) {
        string cur = numBook[i];
        string next = numBook[i + 1];

        if (cur.size() >= next.size()) continue;
        if (cur == next.substr(0, cur.size())) {
            cout << "NO" << endl;
            return;
        }
    }
    cout << "YES" << endl;
}

int main() {
    ios_base::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);

    cin >> t;
    for (int testcase = 0; testcase < t; testcase++) {
        vector<string> numberBook = init();
        sol(numberBook);
    }

    return 0;
}

🤔 문제 후기

전화번호의 길이와 상관있을 줄 알았던 문제였다. 처음에는 길이가 긴 전화번호를 먼저 넣고, 현재의 길이보다 작은 전화번호가 들어오면 지금까지 들어온 전화번호들을 모두 체크하는 방식을 했는데, 10%에서 시간초과로 문제를 틀렸다. 그리고 숫자 처음에 0이 들어오면 생략되는데 그 점을 간과하여 풀었다가 어떤 문제인지 몰랐다. 결과적으로 우연하게 string으로 받은 다음에 정렬하여 출력해봤는데, 풀이가 보인 뒤로는 쉽게 푼 문제였다.

728x90

'문제풀이 > 알고리즘 문제 풀이' 카테고리의 다른 글

[ 백준 20058 ] 마법사 상어와 파이어스톰 (C++) - 구현, 시뮬레이션  (1) 2024.03.08
[ 백준 16234 ] 인구 이동 (C++) - 구현, DFS  (1) 2024.03.08
[ 백준 14890 ] 경사로 (C++) - 구현  (0) 2024.03.08
[ 백준 2493 ] 탑 (C++) - stack, priority_queue  (0) 2024.03.08
[ 백준 16235 ] 나무 재태크 (C++) - 자료구조  (1) 2024.03.08
  1. 🔗 문제 링크
  2. 💡 문제 접근
  3. 💡 문제 풀이 및 해석
  4. ⭐️ 정답 코드 및 설명
  5. 🤔 문제 후기
'문제풀이/알고리즘 문제 풀이' 카테고리의 다른 글
  • [ 백준 20058 ] 마법사 상어와 파이어스톰 (C++) - 구현, 시뮬레이션
  • [ 백준 16234 ] 인구 이동 (C++) - 구현, DFS
  • [ 백준 14890 ] 경사로 (C++) - 구현
  • [ 백준 2493 ] 탑 (C++) - stack, priority_queue
RealTone
RealTone
풀스택 개발자되기 기원 1년차
RealTone
개발공부 블로그
RealTone
전체
오늘
어제
  • 분류 전체보기 (85)
    • 개발자 공부 (8)
      • 인프라 - AWS (2)
      • Frontend - React (2)
      • Frontend - Next (2)
    • 구름톤트레이닝 (2)
      • 강의 후기 (0)
    • 문제풀이 (74)
      • 알고리즘 문제 풀이 (62)
      • SQL 문제 풀이 (12)
    • 개인 (0)
      • 멕북초기화세팅 (0)

블로그 메뉴

  • 홈
  • 태그
  • GitHub
  • 방명록

태그

  • AWS
  • baekjoon
  • CI/CD
  • codedeploy
  • ec2
  • G2
  • G3
  • G4
  • G5
  • git/github

최근 글

hELLO · Designed By 정상우.v4.2.2
RealTone
[ 백준 5052 ] 전화번호 목록 (C++)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.