본문 바로가기

Algorithm

[백준] 2493번 : 탑 - C/C++

728x90

 

하루 종일 걸렸다.

나는 너무 어렵게 풀었다.

 

어렵게 풀었다기 보다는 아직 이정도 난이도의 문제를 풀 정도가 아닌 것 같다.

엄청난 검색과 엄청난 참고를 통해 완성한 나의 코드

 

분류 보고 풀지 말라고 했는데,,, 나는 또 보고 풀었다.

 

일단 풀이를 시작해보겠다.

 

자료구조 문제이고 스택을 이용하라고 했으니까

그렇게 풀어보자.

 

탑의 개수와 높이 설정하기.

int n;
cin >> n;

stack<pair<int,int>> s;

 

pair가 무엇인지에 대해서는 이전 글에 설명했으니

아래 링크를 달아두겠다.

https://binaryroot.tistory.com/9

 

[백준] 10814번 : 나이순 정렬 - C/C++

내가 생각한 문제 해결 순서는 아래와 같다. 1. 회원수 n 입력하기2. 회원의 나이와 이름 입력하기3. 나이순으로 출력하기 문제는 간단했는데이걸 2차원배열로 입력으로 받아버리면.. 시간 초과

binaryroot.tistory.com

 

for문을 이용하여 탑의 높이를 입력한다.

for(int i = 0; i < n; i++){
   int height;
   cin >> height;
}

 

그 다음, 왼쪽에서 가장 먼저 만나는 높은 탑을 찾아주자.

while(!s.empty()){
     if(height < s.top().first){
     cout << s.top().second << " ";
     s.push(make_pair(height, i+1));
     break;
     }
	s.pop();
}

 

  • 스택이 비어 있지 않으면, height와 s.top().first(이전 탑의 높이) 비교
  • 현재 height보다 높은 탑을 만나면, 그 탑의 위치를 출력
  • 요구하는 조건에 맞는 탑을 찾으면
    스택에 '현재 높이'와 '현재 위치' 추가 후 while문 종료

위의 3단계로 while문은 동작한다.

 

마지막으로 추가해주어야 하는 코드는

레이저 신호를 수신하는 탑이 존재하지 않으면 "0"을 출력하는 것.

 

if(s.empty()){
  cout << "0" << " ";
  s.push(make_pair(height, i+1));
}

 

위와 같이 작성 가능하다.

 

 

이제 제출하면 정답이다.

시간초과;

 

근데 이건 마법과도 같은 코드 딱 세 줄만 추가해주면 된다.

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

 

  • ios::sync_with_stdio(false); → C++ 입출력 속도 최적화
  • cin.tie(0); → cin과 cout의 묶음을 풀어 속도 향상
  • cout.tie(0); → 출력 지연 방지

 

진짜 제출해보자.

 

맞았습니다 !! 가 나오게 된다.

 

 

 

 

전체 코드

#include <iostream>
#include <algorithm>
#include <stack>

//탑
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;

    stack<pair<int,int>> s;

    for(int i = 0; i < n; i++){
        int height;
        cin >> height;

        while(!s.empty()){
            if(height < s.top().first){
                cout << s.top().second << " ";
                s.push(make_pair(height, i+1));
                break;
            }
            s.pop();
        }
        if(s.empty()){
            cout << "0" << " ";
            s.push(make_pair(height, i+1));
        }
    }
    cout << '\n';
    return 0;
}

 

무려 골드5의 문제였다.

설명을 하니까 되게 쉬워보인다.

그냥 수학문제도 그렇고

어려운 문제일 수록 뭐랄까,,

생각을 많이하면 풀이가 쉽고

생각을 안하고 다른 방법을 생각하려고 하면 어려운 것처럼

알고리즘 문제도 그런 것 같다.(???)

아무말이나 막하네

 

어쨌든,, 나는 아직 골드라는 난이도의 문제를 풀 실력이 아닌 것 같다.

기초를 더 탄탄하게 공부해서 도전해야겠다.

 

 

 

 

 

 

더 좋은 풀이가 있다면 댓글로 알려주세요 !!

피드백 환영입니다☺️

728x90

'Algorithm' 카테고리의 다른 글

[자료구조] 구간 합  (0) 2025.03.07
[백준] 10867번 : 중복 빼고 정렬하기 - C/C++  (0) 2025.03.06
[백준] 1546번 : 평균 - C/C++  (0) 2025.03.05
[C++] 형 변환  (0) 2025.03.04
[백준] 11720번 : 숫자의 합 구하기 - C/C++  (0) 2025.03.04