- 문제 링크 : boj.kr/32027
- 난이도 : P4
- 태그 : 그리디, 정렬, 브루트포스
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
vector<bool> place(n); // LR
vector<int> L, R;
for(int i = 0; i < n; i++) {
int a;
string s;
cin >> a >> s;
if(s == "R") {
R.emplace_back(a);
place[i] = 1;
}
else {
L.emplace_back(a);
place[i] = 0;
}
}
sort(all(R));
sort(all(L));
int M;
bool Md;
if(R.size() == 0) {
M = L.back();
Md = 0;
L.pop_back();
}
else if(L.size() == 0) {
M = R.back();
Md = 1;
R.pop_back();
}
else {
if(R.back() < L.back()) {
M = L.back();
Md = 0;
L.pop_back();
}
else {
M = R.back();
Md = 1;
R.pop_back();
}
}
int ans = 0;
for(int i = 0; i < n; i++) {
if(place[i] != Md) continue;
vector<int> temp(n);
temp[i] = M;
int ridx = 0;
for(int j = 0; j < i; j++) {
if(place[j] == 1) {
temp[j] = R[ridx];
ridx++;
}
}
int lidx = 0;
for(int j = n-1; j > i; j--) {
if(place[j] == 0) {
temp[j] = L[lidx];
lidx++;
}
}
int cnt = 1;
int LM = 0;
for(int j = 0; j < i; j++) {
if(place[j] == 0) {
while(lidx < L.size() && L[lidx] <= LM) {
lidx++;
}
if(lidx < L.size()) {
cnt++;
temp[j] = L[lidx];
}
}
LM = max(LM, temp[j]);
}
int RM = 0;
for(int j = n-1; j > i; j--) {
if(place[j] == 1) {
while(ridx < R.size() && R[ridx] <= RM) {
ridx++;
}
if(ridx < R.size()) {
cnt++;
temp[j] = R[ridx];
}
}
RM = max(RM, temp[j]);
}
ans = max(ans, cnt);
}
cout << ans;
return 0;
}
풀이
키가 제일 큰 미어캣을 기준으로 생각해보자.
이 미어캣을 기준으로 왼쪽에 있는 R미어캣은 절대 망을 볼 수 없다.
반대의 경우도 마찬가지이다.
절대 망을 볼 수 없는 곳에 필요 없는 미어캣을 버려야 한다.
기준에서 먼 곳부터 작은 미어캣을 배치한다.
이후에 기준의 왼쪽에는 왼쪽을 보는 미어캣을 망을 볼 수 있는 가장 작은 미어캣이 오도록 배치한다. 오른쪽의 경우도 마찬가지로 할 수 있다.
728x90
'PS' 카테고리의 다른 글
BOJ 1655 : 가운데를 말해요 (0) | 2024.07.19 |
---|---|
BOJ 3126 : 반역의 원철이 (0) | 2024.07.18 |
BOJ 32031 : 석고 모형 만들기 (0) | 2024.07.16 |
BOJ 16043 : Missing Gnomes (0) | 2024.07.15 |
BOJ 7983 : 내일 할거야 (1) | 2024.07.14 |