백준 2493 탑 (Java,자바)

jonghyukLee·2022년 1월 26일
0

이번에 풀어본 문제는
백준 2493번 탑 입니다.

📕 문제 링크

❗️코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

class Tower
{
    int h,n;

    public Tower(int h, int n) {
        this.h = h;
        this.n = n;
    }
}
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());
        Stack<Tower> s = new Stack<>();
        StringBuilder sb = new StringBuilder();
        int t_num = 1;
        for(int i = 0; i < n; ++i)
        {
            Tower next = new Tower(Integer.parseInt(st.nextToken()),t_num++);
            int res;
            while(!s.isEmpty() && s.peek().h < next.h) s.pop();
            if(s.isEmpty()) res = 0;
            else
            {
                res = s.peek().n;
            }
            s.push(next);
            sb.append(res).append(" ");
        }
        System.out.print(sb);
    }
}

📝 풀이

입력 순서로 존재하는 각각의 높이의 타워에서, 우측 -> 좌측으로 레이저를 쏜다 했을 때 레이저를 쏜 타워보다 높이가 높거나 같다면 신호를 수신할 수 있다는 조건입니다. 위 상황에서 각각의 타워가 쏜 레이저를 몇 번째 타워가 수신하는지를 순서대로 출력하는 문제입니다.
입력받은 순서대로 진행하게 되면, 먼저 입력 받자마자 자신의 높이와 번호를 지닌 Tower객체를 생성해줍니다. 그 다음, 스택에 남은 타워가 존재하면서, 자신보다 높은 타워를 만날때까지 스택을 탐색해줍니다. 만약 자신보다 낮은 타워가 스택에 존재한다면, 앞으로 있을 입력에서 현재 타워에게 가려져 앞으로 더이상 필요없는 타워가 되기때문에, 바로 pop연산을 수행해줍니다.
위 과정에서 자신보다 높은 타워를 만난다면 바로 그 타워가 현재 타워의 레이저를 수신할 수 있는 타워가 될 것입니다. 따라서 해당 번호를 입력해주고, 마지막으로 현재 타워의 정보를 스택에 push해주면 됩니다.

📜 후기

스택을 좀 더 익숙해지고 싶어서 스택 문제를 골라서 풀어보았는데요, 그냥 별 기준없이 선택한 문제인데, 어제 푼 문제랑 너무 똑같아서 놀랐습니다 ㅋㅋㅋㅋㅋ 자주 활용되지는 못할 것 같지만, 앞으로 스택 관련 문제가 나온다면 이전보다는 확실하게 사용할 수 있을 것 같습니다.

profile
머무르지 않기!

0개의 댓글