https://www.acmicpc.net/problem/1966
접근 방법 / 풀이
현재 문서보다 중요도가 높은 문서의 유무의 따라 해야하는 행동이 다르므로, 현재 문서보다 중요도가 높은 문서의 유무를 판단하기 위해imp 1차원 배열을 만들어 처리했다. 왜냐하면 \( 1 \leq 중요도 \leq 9 \) 이기 때문이다.
구체적으로 현재 문서보다 중요도가 높은 문서의 유무를 살필 때에는, \( O(9) \)의 완전탐색을 해주면 된다.
입력을 받을 때 {중요도, 인덱스} 쌍으로 큐에 넣어놓고, 큐의 앞에서 하나씩 꺼내면서 필요한 행동을 하면 된다.
이런 행동들을 반복하다가 \( 인덱스==m \) 인 경우에 답을 출력하고 종료하면 된다.
시간 복잡도
최악의 경우,
인쇄할 문서가 매번 큐의 가장 뒤에 있고,
중요도도 매번 9번 검사해야 하고,
\( 인덱스==m \)이 될 때가 마지막 문서를 출력할 때 라고
가정해보면, 하나의 테스트케이스 당 \( O(9*n^2) \) 라 할 수 있다. \( n \leq 100 \) 이므로 시간 안에 풀 수 있다.
코드
#include <bits/stdc++.h>
#define ll long long int
#define pll pair<ll, ll>
#define pii pair<int, int>
#define X first
#define Y second
using namespace std;
int dx[]={-1, 1, 0, 0};
int dy[]={0, 0, -1, 1};
void solve()
{
int imp[10]={0};
queue<pii> q;
int n, m; cin>>n>>m;
for(int i=0;i<n;i++)
{
int x; cin>>x;
q.push({x, i});
imp[x]++;
}
int ans=0;
while(1)
{
pii now=q.front();
q.pop();
bool flag=false;
for(int i=now.X+1;i<=9;i++)
if(imp[i]>0)
{
flag=true;
break;
}
if(flag) q.push(now);
else
{
imp[now.X]--;
ans++;
if(now.Y==m)
{
cout<<ans<<'\n';
break;
}
}
}
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0);
int tc=1; cin>>tc;
while(tc--) solve();
return 0;
}
테스트케이스 형식의 문제이므로 큐와 imp배열 초기화 하는 것을 까먹지 말고 실수하지 말자. 처음에 초기화를 안해줘서 값이 이상하게 나왔었다.
'PS' 카테고리의 다른 글
PS 환경 설정 글 모음 (0) | 2022.07.23 |
---|---|
[BOJ] 2785번: 체인 (0) | 2022.06.23 |
[BOJ] 5525번: IOIOI (0) | 2022.06.15 |
[BOJ] 2981: 검문 (1) | 2022.06.08 |
[BOJ] 1561번: 놀이공원 (0) | 2022.06.07 |