※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 18131번 문제인 치삼이의 플레이리스트이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/18131
18131번: 치삼이의 플레이리스트
첫 번째 줄에 세 개의 정수로 현재 플레이리스트 곡 수 N(1 ≤ N ≤ 1,000)과 주어지는 명령의 개수 M(1 ≤ M ≤ 10,000), 곡이 삭제되는 기준 S(1 ≤ S ≤ 100,000,000)가 주어진다. 두 번째 줄부터 N+1
www.acmicpc.net
문제에 주어진 "플레이리스트"의 작동을 그대로 구현하는 문제이다.
모든 명령을 벡터의 erase와 insert를 이용해 구현해도 충분히 시간 내에 돌 수 있을 정도로 입력크기가 제한되어 있으므로 벡터를 이용해 단순하게 지문에 적힌대로 구현해주자.
다음으로 곡을 재생할 때 어떤 곡의 몇 초부터 재생해야하는가에 대한 정보가 필요하므로 이를 기록해두는 전역변수를 선언하면 구현을 편하게 해낼 수 있을 것이다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int N, M, S;
int playid, playmin;
vector<pair<pair<string, int>, int>> playlist; // {{제목,곡길이},치삼지수}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> S;
for (int n = 0; n < N; n++) {
string s; int mn; cin >> s >> mn;
playlist.emplace_back(make_pair(make_pair(s, mn), 0));
}
while (M--) {
string q; cin >> q;
if (q == "L") {
int T; cin >> T;
while (T && playid < N) {
if (T >= playlist[playid].first.second - playmin) {
playlist[playid].second += (playlist[playid].first.second - playmin) * (playid + 1);
T -= playlist[playid].first.second - playmin;
if (playlist[playid].second >= S) {
cout << playlist[playid].first.first << '\n';
playlist.erase(playlist.begin() + playid);
playmin = 0;
N--;
}
else playid++, playmin = 0;
}
else {
playlist[playid].second += T * (playid + 1);
playmin += T;
T = 0;
if (playlist[playid].second >= S) {
cout << playlist[playid].first.first << '\n';
playlist.erase(playlist.begin() + playid);
playmin = 0;
N--;
}
}
}
}
else if (q == "AR") {
int id = -1, mx = -1;
for (int i = 0; i < N; i++) {
auto& p = playlist[i];
if (p.second > mx) id = i, mx = p.second;
}
if (id < 0) cout << -1 << '\n';
else {
cout << playlist[id].first.first << '\n';
if (playid > id) playid--;
else if (playid == id) playmin = 0;
playlist.erase(playlist.begin() + id);
N--;
}
}
else if (q == "R") {
string s; cin >> s;
int id = -1;
for (int i = 0; i < N; i++) {
auto& p = playlist[i];
if (p.first.first == s) id = i;
}
if (id < 0) cout << -1 << '\n';
else {
cout << playlist[id].second << '\n';
if (playid > id) playid--;
else if (playid == id) playmin = 0;
playlist.erase(playlist.begin() + id);
N--;
}
}
else if (q == "P") {
string s; int mn; cin >> s >> mn;
playlist.insert(playlist.begin(), make_pair(make_pair(s, mn), 0));
playid = 0, playmin = 0;
N++;
}
else if (q == "AE") {
int mx = -1;
for (auto& p : playlist) {
mx = max(mx, p.second);
}
cout << mx << '\n';
}
else {
int ret = -1;
string s; cin >> s;
for (auto& p : playlist) {
if (p.first.first == s) {
ret = p.second;
break;
}
}
cout << ret << '\n';
}
}
}
'BOJ' 카테고리의 다른 글
[BOJ 15793 // C++] Anagrams (0) | 2023.08.16 |
---|---|
[BOJ 6993 // C++] Shift Letters (0) | 2023.08.15 |
[BOJ 18133 // C++] 가톨릭대학교에 워터 슬라이드를?? (0) | 2023.08.14 |
[BOJ 3183 // C++] Dates (0) | 2023.08.14 |
[BOJ 2435 // C++] 기상청 인턴 신현수 (0) | 2023.08.14 |