본문 바로가기

문제 풀이/문제 풀이(BOJ)

[Silver V] MP3 Songs - 7596

[문제 위치]

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

[문제 풀이]

이 문제는 정렬(대소문자 무시 비교) 를 통해 해결하는 문제이다.
각 테스트마다 n개의 노래 제목을 받아서 알파벳 순(대소문자 구분 없이)으로 정렬해야 하므로 문자열을 읽은 뒤 대소문자를 무시하는 비교 함수를 이용해서 정렬하고, 케이스 번호(1부터 증가)를 한 줄로 출력한 다음 정렬된 제목들을 그대로 출력하는 방식으로 간단하게 해결한다
아래는 이를 구현한 코드이다.

#include <bits/stdc++.h>
using namespace std;

#define FASTIO ios::sync_with_stdio(false); cin.tie(nullptr);

// 대소문자 무시 비교 (tie-breaker로 원문 사전순 사용)
bool ciLess(const string& a, const string& b) {
    size_t i = 0, na = a.size(), nb = b.size();
    while (i < na && i < nb) {
        unsigned char ca = (unsigned char)a[i];
        unsigned char cb = (unsigned char)b[i];
        char la = tolower(ca), lb = tolower(cb);
        if (la != lb) return la < lb;
        ++i;
    }
    if (na != nb) return na < nb; // 접두 관계면 짧은 쪽이 먼저
    return a < b;                 // 완전히 같으면 원문 기준으로 결정
}

int main() {
    FASTIO;

    int n, tc = 0;
    while ( (cin >> n) ) {
        if (n == 0) break;
        string dummy; getline(cin, dummy); // 남은 개행 제거

        vector<string> v(n);
        for (int i = 0; i < n; ++i) getline(cin, v[i]);

        stable_sort(v.begin(), v.end(), ciLess);

        cout << ++tc << '\n';
        for (const string& s : v) cout << s << '\n';
    }
    return 0;
}