728x90
반응형
https://www.acmicpc.net/problem/23253
23253번: 자료구조는 정말 최고야
위 그림처럼 책이 쌓여 있으므로, 첫 번째 더미 - 두 번째 더미 - 첫 번째 더미 - 두 번째 더미 순으로 꺼내면 책 번호순으로 나열할 수 있다.
www.acmicpc.net
처음 이 문제를 풀때 더미의 순서를 일정하게 유지하는 부분이 힘들었다. 이에 다양한 접근법을 시도하면서 vector를 통해 해결했다.
접근 방법
1) 우선 순위 큐를 선언한다. 이때 오름차순으로 정렬될 수 있게 설정한다.
2) 우선 순위 큐에 해당 책과 어느 더미 몇 번째에 위치하는지 저장한다.
3) lis라는 vector를 통해 각 더미의 현재 위치를 추적하는데 사용한다. 즉 lis의 각 요소 해당 더미의 현재 위치를 나타내며 이는 우선 순위 큐에서 추출된 요소의 위치와 일치하는지 아닌지 판단한다.
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#define FastIO ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL);
using namespace std;
int main(void)
{
FastIO;
int N = 0, M = 0; // N권 교과서, 더미 M개
cin >> N >> M;
int K = 0; // 더미 개수 K
priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>> pq;
vector<int> lis(M, 0);
for (int i = 0; i < M; i++)
{
int temp = 0;
cin >> K;
for (int j = K-1; 0 <= j; j--)
{
cin >> temp;
pq.push(make_pair(temp, make_pair(i, j)));
}
}
while (!pq.empty())
{
pair<int, pair<int, int>> tmpPair = pq.top();
pq.pop();
if (lis[tmpPair.second.first]++ != tmpPair.second.second)
{
cout << "No" << "\n";
return 0;
}
}
cout << "Yes" << "\n";
return 0;
}
728x90
반응형
'알고리즘 (C++)' 카테고리의 다른 글
[백준]20499번: Darius님 한타 안 함? (0) | 2024.02.01 |
---|---|
[백준]17388번: 와글와글 숭고한 (0) | 2024.01.27 |
[백준]1296번: 팀 이름 정하기 (0) | 2023.12.13 |
[백준]25497번: 기술 연계마스터 임스 (0) | 2023.12.06 |
[백준]2018: 수들의 합 5 (0) | 2023.12.05 |