2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
문제 분석
- 오큰수와 매우 유사하다. ( https://genius00hwan.tistory.com/68 )
- 시간제한이 0.5초 더 널널하다
- 다뤄야 하는 정수의 수도 오큰수 보다 적다.
- 오큰수 방식으로 풀면 시간초과는 안나겠다.
- 각 원소의 값보다 왼쪽에 있는 수에 대한 문제이다.(오큰수는 오른쪽)
- 오큰수는 원소의 값을 가리킨다면, 이 문제는 원소의 인덱스를 가리킨다.
[BOJ 17298] 오큰수
17298번: 오큰수 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다. www.acmicpc.net 문제 분석 시간제한 1초 : Big..
genius00hwan.tistory.com
풀이 방식
- 왼쪽에 있는 수 부터 처리한다.
- 나머지는 오큰수와 같은 논리로 푼다.
- 스택에 원소의 인덱스도 함께 저장한다.
vector<pair<int, int>> twr; //(탑의 높이, 수신한 탑의 번호)
stack<pair<int, int>> rcp; //(탑의 높이, 탑의 번호)
int n;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n;
twr.emplace_back(0, 0);
//가장 왼쪽의 있는 탑의 번호는 1번이므로 0번 인덱스에 의미없는 값을 넣어준다.
while (n--) {
int x;
cin >> x;
twr.emplace_back(x, 0);
}
for (int i = 1; i < twr.size(); i++) {
while (!rcp.empty()) {
if (rcp.top().first > twr[i].first) {
twr[i].second = rcp.top().second;
break;
} else {
rcp.pop();
}
}
rcp.push({twr[i].first, i});//스택에 저장할때 인덱스도 함께 저장한다.
}
for (int i = 1; i < twr.size(); i++) {
cout << twr[i].second << " ";
}
return 0;
}
느낀 점
- 오큰수 유형의 문제를 벌써 세번째 풀었다. 이 유형의 문제는 꽤 중요하다는 생각이 든다.
- 주기적으로 오큰수 문제를 복습하고 비슷한 유형의 문제를 찾아 풀어봐야 겠다.
'Algorithm > baekjoon' 카테고리의 다른 글
[BOJ 5052] 전화번호 목록 (0) | 2022.07.27 |
---|---|
[BOJ 1918] 후위표기식 (0) | 2022.07.26 |
[BOJ 17299] 오등큰수 (0) | 2022.07.26 |
[BOJ 17298] 오큰수 (0) | 2022.07.26 |
[BOJ 19638] 센티와 마법 뿅망치 (0) | 2022.07.26 |