GitHubSeob
C++ / 백준 / 2493 / 탑 본문
문제
https://www.acmicpc.net/problem/2493
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
문제풀이
입력을 받는 vector<int>tower, 답을 저장하기 위한 vector<int>answer, 스택을 쌓기 위해 stack<int>s를 선언한다.
스택 s에는 타워의 번호 값을 저장한다.
for문을 통해 가장 왼쪽에 있는 타워부터 오른쪽으로 이동하면서 비교를 한다.
만약 현재 스택의 top() 부분의 타워의 높이가 현재 비교하려는 타워 높이보다 높거나 같으면 레이저를 수신할 수 있으므로 answer에 s.top()+1 값을 저장한다.
그렇지 않다면, 스택을 pop() 하면서 현재 비교하려는 타워 높이 이상인 타워가 있는지 스택 s가 빌 때까지 while문을 통해 반복하면서 찾는다.
찾게 되면 마찬가지로 answer에 타워의 번호를 저장한다.
존재하지 않아 스택이 비게 되면 while문을 종료한다.
조건문을 돌고 현재 타워의 번호를 스택에 입력한다.
코드
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
int N(0), idx(0);
cin >> N;
vector<int>tower(N, 0);
vector<int>answer(N, 0);
stack<int>s;
for (idx = 0; idx < N; ++idx)
cin >> tower[idx];
s.push({ 0 });
for (idx = 1; idx < N; ++idx) {
if (tower[s.top()] >= tower[idx]) {
answer[idx] = s.top() + 1;
}
else {
while (s.size() > 1) {
s.pop();
if (tower[s.top()] >= tower[idx]) {
answer[idx] = s.top() + 1;
break;
}
}
}
s.push(idx);
}
for (idx = 0; idx < N; ++idx)
cout << answer[idx] << ' ';
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 7662 / 이중 우선순위 큐 (0) | 2022.03.30 |
---|---|
C++ / 백준 / 1918 / 후위 표기식 (0) | 2022.03.21 |
C++ / 백준 / 2800 / 괄호 제거 (0) | 2022.03.14 |
C++ / 백준 / 22942 / 데이터 체커 (0) | 2022.03.14 |
C++ / 백준 / 1039 / 교환 (0) | 2022.01.30 |