※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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';
		}
	}
}
728x90

+ Recent posts