백준 3156

yun·2024년 2월 5일
0

C++

목록 보기
33/41
#include <algorithm>
#include <iostream>
#include <map>
#include <string>
#include <utility>
#include <vector>

using namespace std;

int main()
{
   int N;
   cin >> N;

   map<string, int> earliest;
   for ( int i=0; i<N; ++i ) {
      int a, b;
      string od;
      cin >> a;
      cin >> od;
      cin >> b;

      for ( int j=0; j<a; ++j ) {
         string song;
         cin >> song;
         map<string, int>::iterator it = earliest.find( song );
         if ( it == earliest.end() )
            earliest[song] = b;
         else
            it->second = min( b, it->second );
      }
   }

   vector<pair<int, string> > song_ranking;
   for ( map<string, int>::iterator it=earliest.begin(); it!=earliest.end(); ++it )
      song_ranking.push_back( make_pair( it->second, it->first ) );
   sort( song_ranking.begin(), song_ranking.end() );

   for ( int i=0; i<(int)song_ranking.size(); ++i ) {

      if ( i == 0 || song_ranking[i].first != song_ranking[i-1].first ) {

         if ( song_ranking[i].first-1 == i ) {
            cout << song_ranking[i].first << " " << song_ranking[i].second << endl;
         }
      }
   }

   return 0;
}

아래는 vector랑 sort를 안 쓰고 map만 사용해 보려고 했는데 테스트케이스는 통과해도 자꾸 틀렸다고 나오는 코드

#include <iostream>
#include <map>
#include <set>

using namespace std;

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

   int N;
   cin >> N; // 입력될 행

   map<string, int> rank_map; // 순위 저장
   for ( int i=0; i<N; ++i ) {
      int a, rank;
      string od;
      cin >> a; // 입력될 노래의 개수
      cin >> od; // 문자열 od
      cin >> rank; // 몇 위 이내의 곡인지

      for ( int j=0; j<a; ++j ) {
         string song;
         cin >> song; // 노래제목
         map<string, int>::iterator it = rank_map.find( song );

         // rank_map에 노래가 없으면 추가, 이미 있는 경우 현재 순위와 입력된 순위를 비교해서 더 낮은 순위로 업데이트
         if ( it == rank_map.end() )
            rank_map[song] = rank;
         else
            it->second = min( rank, it->second );
      }
   }

   map<int, string> final_map;

   set<int> before_ranks;
   for (auto& item : rank_map)
   {
      // cout << "before_rank: " << before_rank << endl;
      // cout << item.second << " " << item.first << endl;

      final_map.emplace(item.second, item.first);

      if (before_ranks.find(item.second) != before_ranks.end())
      {
         final_map.erase(item.second);
      }

      before_ranks.emplace(item.second);
   }

   for (auto& item : final_map)
   {
      cout << item.first << " " << item.second << endl;
   }

   return 0;
}

이건 그보다 전에 주어진 노래 갯수가 1일 때는 확정순위로 저장하고, 아니면 다른 로직으로 계산하는 코드. 테스트케이스만 통과하고 제출하면 틀림.

#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int N;
    cin >> N;

    map<int, set<string>> rankToSongs;
    map<string, set<int>> songToPossibleRanks;
    map<int, string> confirmedRanks;

    for (int i = 0; i < N; ++i) {
        int A, B;
        cin >> A;
        string od;
        cin >> od;
        cin >> B;
        set<string> songs;
        for (int j = 0; j < A; ++j) {
            string song;
            cin >> song;
            songs.insert(song);
        }

        if (A == 1)
        {
            confirmedRanks[B] = *songs.begin();
        }
        else
        {
            for (int j = 1; j <= B; ++j)
            {
                rankToSongs[j].insert(songs.begin(), songs.end());
            }

            for (auto& song : songs)
            {
                songToPossibleRanks[song].insert(B);
            }
        }
    }

    // 제거 로직
    for (auto& pair : songToPossibleRanks) {
        const string& song = pair.first;
        const set<int>& ranks = pair.second;

        if (ranks.size() > 1) {
            for (auto& rank : ranks) {
                rankToSongs[rank].erase(song);
            }
        }
    }

    // 확정된 순위 추가
    for (auto& pair : rankToSongs) {
        const int& rank = pair.first;
        const set<string>& songs = pair.second;

        if (songs.size() == 1) {
            confirmedRanks[rank] = *songs.begin();
        }
    }

    // 결과 출력
    for (auto& pair : confirmedRanks) {
        cout << pair.first << " " << pair.second << endl;
    }

    return 0;
}

0개의 댓글