백준 알고리즘
[백준 문제풀이] 백준 2493 c++ 탑
mindun
2025. 2. 14. 17:55
반응형

문제 요약
1. n개의 탑이 생성
2. 각 탑은 왼쪽으로 신호를 보냄
3. 신호를 받으려면 신호를 보낸 탑보다 커야함
4. 신호를 보낸 탑의 노드에서 신호를 받은 탑의 인덱스 출력
5. 신호를 받지 못하는 노드는 0 출력
스택을 활용해서 깔끔하게 풀 수 있다.
입력받은 순서대로 스택에 넣어줘서 input의 마지막 탑부터 처리한다.( 신호는 왼쪽으로 가기 때문에 )
i 노드에서 왼쪽으로 신호를 보내는 것을 확인하기 위해 i-1 번째의 탑과 크기를 비교한다.
만약 i-1 번째 탑이 더 크다면 정답 배열에 i-1 노드의 인덱스를 기록하면 된다.
i-1 번째 탑이 더 작다면 i 번째 탑을 또 다른 스택에 저장한다.
이떄 저장되는 값은 두 번째 스택에서 가장 작은 값일 수 밖에 없다.
마찬가지의 논리로 i-1 번째 탑이 더 커서 정답배열에 i-1 노드의 인덱스를 기록한 후,
탑이 커서 신호를 전달하지 못한 탑들의 정보가 담겨있는 두번 째 탑의 크기를 i-1 번째와 비교한다.
탑의 크기가 i-1번째가 작을 때 까지 비교하면 된다.
#include <iostream>
#include <stack>
int top[500001] = {};
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int n;
std::cin >> n;
std::stack<std::pair<int,int>> s;
int tmp;
for (int i{ 1 }; i <= n; i++) {
std::cin >> tmp;
s.push({ i, tmp });
}
std::stack<std::pair<int,int>> s2;
int k = n-1;
while (!s.empty() && k > 0) {
int h = s.top().second;
int num = s.top().first;
s.pop();
if (!s.empty() && s.top().second >= h) {
top[num] = k;
while (!s2.empty() && s2.top().second <= s.top().second) {
top[s2.top().first] = k;
s2.pop();
}
}
else {
s2.push({ num, h });
}
k -= 1;
}
for (int i{ 1 }; i <= n; i++) {
std::cout << top[i] << "\n";
}
}
반응형