Algorithm/baekjoon

마닐라 2022. 1. 30. 16:57

📍 문제 설명

 

💡 접근

효율성을 위해 스택을 이용하여 풀어야하는 문제

1.현재 값과 스택의 값을 비교하여 현재 값이 더 크면 이전 지점의 스택의 값들을 계속해서 빼준다.

- 작은 이전 지점의 탑은 현재 지점의 탑에서 신호가 막히므로

2.신호 가능 지점을 발견했을땐 출력만 하고 멈춘다.

3.현재 지점의 탑을 스택에 넣는다.

 

👩‍💻 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n;
    static int[] board;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        board = new int[n];
        for(int i = 0; i < n; i++) {
            board[i] = Integer.parseInt(st.nextToken());
        }

        T.solution();
        System.out.println(sb);
    }

    private void solution() {
        Stack<Top> s = new Stack<Top>();

        for(int i = 0; i < n; i++) {
            //현재 값이 스택의 값보다 작거나 같아지는 부분 or 스택이 비어있지 않을 때까지 탐색
            while(!s.isEmpty()){
                //현재 값이 더 크면 빼주기
                if(board[i] >= s.peek().height) s.pop();
                //신호 가능지점 발견!
                else {
                    sb.append(s.peek().number + " ");
                    break;
                }
            }
            //신호보낼 수 있는 지점 없으면 0
            if(s.isEmpty()) sb.append(0 + " ");

            //현재 지점은 무조건 스택에 넣기
            s.push(new Top(board[i], i+1));
        }
    }

    private class Top {
        private int height;
        private int number;

        public Top(int height, int number) {
            this.height = height;
            this.number = number;
        }

        @Override
        public String toString() {
            return "Top{" +
                    "height=" + height +
                    ", number=" + number +
                    '}';
        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

사탕 게임  (0) 2022.01.31
히스토그램==========  (0) 2022.01.30
  (0) 2022.01.29
문자열 폭발  (0) 2022.01.28
크게 만들기  (0) 2022.01.28