코딩테스트

백준 - 2493번 탑

NellKiM 2025. 4. 9. 22:57
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main_2493 {

	public static void main(String[] args) throws Exception{
	  //입력객체 생성
	  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	  //출력데이터 모으기
	  StringBuilder sb = new StringBuilder();
	  
	  int N = Integer.parseInt(br.readLine()); //탑의 수
	  StringTokenizer tokens = new StringTokenizer(br.readLine());//한줄에 공백을 구분자로 하는 두개 이상의 데이터
	  //tokens = ["6" "9" "5" "7" "4"]  : 탑의 높이 정보
	  
	  Stack<Tower> stack = new Stack<>(); //스택에는 탑의 [번호와 높이] 정보를 저장
	  
//	  int [] tower = new int[2];// 0번지를 번호, 1번지를 높이로 약속하겠다
//	  Stack<int[]> stack2 = new Stack<>();
	  
	  for(int no=1; no<=N; no++) {//탑의 수만큼 반복 : 번호는 1번부터~~
		 int towerHeight =  Integer.parseInt(tokens.nextToken()); //높이 비교
		
		while(!stack.isEmpty()) {// 스택에 비교할 값이 존재한다면
			 
		
			if( stack.peek().height >  towerHeight   ) {   //기존 탑의 높이와 새로입력된 탑의 높이 비교
		        //    old(왼쪽 탑)         new(오른쪽 탑)
				sb.append(stack.peek().no +" ");
				break;
			}
			stack.pop();//맨 위의 탑 정보 삭제 
		}
		
		if(stack.isEmpty()) sb.append("0 ");
		
		//마지막 타워를 스택에 추가
		stack.push(new Tower(no, towerHeight));
	 }
	  
	  System.out.println(sb.toString());
	  
      br.close();
	}//main
	
    static class Tower{
    	int no;
    	int height;
    	
		public Tower(int no, int height) {
			this.no = no;
			this.height = height;
		}    	
    }//class Tower

}