※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 15237번 문제인 Cipher이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/15237
15237번: Cipher
First line of input contains two integers, N (1 ≤ N ≤ 1 000), length of message, and C (1 ≤ C ≤ 1 000 000 000), the number from task description. Next line contains N integers smaller than or equal to C, message itself.
www.acmicpc.net
등장하는 수를 첫번째 기준으로 등장횟수 내림차순, 두번째 기준으로 등장순서 오름차순으로 정렬해 문제를 해결하자.
등장하는 수의 범위가 넓으므로 map 등을 이용해 좌표압축을 한 뒤 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int N, C;
int idx = 0;
map<int, int> mp; // int_to_idx
int invmp[1000];
int cnt[1000];
vector<pair<int, int>> vec;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> C;
while (N--) {
int x; cin >> x;
if (mp.count(x) == 0) {
invmp[idx] = x;
mp.insert(make_pair(x, idx++));
}
cnt[mp[x]]++;
}
for (int i = 0; i < idx; i++) {
vec.emplace_back(make_pair(-cnt[i], i));
}
sort(vec.begin(), vec.end());
for (int i = 0; i < idx; i++) {
int K = -vec[i].first, x = invmp[vec[i].second];
while (K--) cout << x << ' ';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1708 // C++] 볼록 껍질 (0) | 2023.05.19 |
---|---|
[BOJ 15235 // C++] Olympiad Pizza (0) | 2023.05.18 |
[BOJ 15242 // C++] Knight (0) | 2023.05.16 |
[BOJ 15245 // C++] Boom! (0) | 2023.05.15 |
[BOJ 1911 // C++] 흙길 보수하기 (0) | 2023.05.14 |