https://programmers.co.kr/learn/courses/30/lessons/42588

 

코딩테스트 연습 - 탑 | 프로그래머스

수평 직선에 탑 N대를 세웠습니다. 모든 탑의 꼭대기에는 신호를 송/수신하는 장치를 설치했습니다. 발사한 신호는 신호를 보낸 탑보다 높은 탑에서만 수신합니다. 또한, 한 번 수신된 신호는 다른 탑으로 송신되지 않습니다. 예를 들어 높이가 6, 9, 5, 7, 4인 다섯 탑이 왼쪽으로 동시에 레이저 신호를 발사합니다. 그러면, 탑은 다음과 같이 신호를 주고받습니다. 높이가 4인 다섯 번째 탑에서 발사한 신호는 높이가 7인 네 번째 탑이 수신하고, 높이가 7

programmers.co.kr

왼쪽으로 레이저 신호를 발사할 것이므로 신호를 송신할 탑보다 앞쪽 인덱스의 탑들을 검사해주면 된다.

앞쪽의 탑들 중 송신하는 탑보다 높은 탑이 있다면 그 탑의 인덱스를 스택에 넣어준다.

앞쪽의 탑들을 모두 검사했는데 송신탑보다 높은 탑이 하나도 없다면 0을 스택에 넣어준다.

 

가장 왼쪽에 있는 탑은 신호를 수신할 탑이 앞쪽에 없으므로 스택에 바로 0을 넣어주어서 따로 처리를 해준다.

그리고 다시 왼쪽에 있는 탑부터 수신 탑의 인덱스를 출력하기 위해서 스택에서 꺼낸 값들을 바로 answer에 넣어준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string>
#include <vector>
#include <stack>
 
using namespace std;
 
vector<int> solution(vector<int> heights) {
    
    vector<int> answer;
    stack<int> st;
    
    int size = heights.size();
    for(int i=size-1; i>0; i--) {
        bool flag = false;
        
        //왼쪽으로 레이저 신호를 발사
        for(int j=i-1; j>=0; j--) {
            if(heights[i] < heights[j]) {
                st.push(j+1);
                flag = true;
                break;
            }
        }
        
        //수신할 수 있는 탑이 하나도 없다.
        if(!flag) {
            st.push(0);
        }
    }
    
    
    //가장 왼쪽 탑
    st.push(0);
    
    while(!st.empty()) {
        answer.push_back(st.top());
        st.pop();
    }
    
    
    return answer;
}
Colored by Color Scripter
 

+ Recent posts