‡ CODING TEST STUDY ‡/º 백준

[백준 2493번 C++] 탑

Trudy | 송연 2023. 9. 10. 01:36

2493번: 탑 (acmicpc.net)

 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1

www.acmicpc.net

 


탑을 배열로 입력을 받아서

가장 오른쪽부터 자신보다 높은 가장 가까운 왼쪽 탑을 새로운 배열에 저장시키면 된다

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, m;
    cin >> n;
    
    vector<int> v;
    vector<int> r;
    
    for(int i=0; i<n; i++){
        cin >> m;
        v.push_back(m);
    }
    
    r.push_back(0);
    for(int i=1; i<n; i++){
        int m = i-1;
        
        while(m>=0){
            //v[i]보다 높은 탑을 발견했을 때
            if(v[m] > v[i]){
                r.push_back(m+1);
                break;
            }
            //v[i]보다 높지 않을 때
            else{
                m--;
            }
        }
        if(m<0) r.push_back(0);
    }
    
    //r 벡터를 출력
    for(int i=0; i<n; i++){
        cout <<  r[i] <<" ";
    }
    
    return 0;
}

이렇게 가장 직관적으로 해서 잘 출력되는 것을 확인하고 제출하니

시간 초과

..

 

검색해보니 스택을 이용하면 해결할 수 있다고 한다

 

[C++] 백준 2493번 : 탑 (tistory.com)

 

[C++] 백준 2493번 : 탑

https://www.acmicpc.net/problem/2493 2493번: 탑 첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사

codinghejow.tistory.com

백준 - 2493 탑 :: 화투의 개발 블로그 (tistory.com)

 

백준 - 2493 탑

[문제 링크] 스택을 이용하면 쉽게 푸는 문제이다.나는 입력 받으면서 스택에서 체크하여 값을 출력하는 방식으로 풀었다. 값을 입력받으면, 스택을 체크한다. 스택을 체크해서 스택이 비었으면

hsp1116.tistory.com

스택으로 수정해도 시간 초과가 떴는 데, 

가장 위 두 줄을 추가해주니까 해결됐다.

cin.tie(0);
ios_base::sync_with_stdio(false);

 

그렇게 최종 코드는

#include <iostream>
#include <stack>

using namespace std;

int main() {
	cin.tie(0);
    ios_base::sync_with_stdio(false);
    
    int n, m;
    stack<pair<int, int>> s;
    
	cin >> n;
	
	for (int i = 0; i < n; i++) {
		cin >> m;
		
		//스택이 쌓여있으면 자신보다 큰 게 존재
		while (!s.empty()) {
		    //자신보다 큰 탑을 찾으면
			if (m < s.top().second) {
				cout << s.top().first << " ";
				break;
			}
			s.pop();
		}
		
		//스택이 비어있으면 자신보다 큰 게 없는 것
		if (s.empty()) cout << 0 << " ";
	
		
		s.push({ i + 1, m });
	}
}