Development Palette

n2493_탑 본문

Algorithm/Baekjoon

n2493_탑

징주 2021. 8. 5. 22:27

top index : 1 ~ 500,000
top value : 1 ~ 100,000,000 

범위가 크기 때문에 이중 for문을 돌리면 시간 초과가 발생한다.

package com.hw.n2493_탑;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Stack;
import java.util.StringTokenizer;

//top index : 1 ~ 500,000
//top value : 1 ~ 100,000,000
public class Main2 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		//System.setIn(new FileInputStream("src\\com\\hw\\n2493_탑\\input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());

		StringTokenizer st = new StringTokenizer(br.readLine());

		int[] top = new int[n]; // 탑의 높이 저장
		for (int t = 0; t < n; t++) {
			top[t] = Integer.parseInt(st.nextToken());
		}

		int[] receive = new int[n]; // 탑의 index를 배열 index에 맞춰서 수신값 저장
		receive[0] = 0;
		for (int i = n - 1; i >= 1; i--) { // i는 신호를 보내는 현재 탑위치
			for (int j = i - 1; j >= 0; j--) {	//j는 신호를 받는 탑위치
				if (top[i] < top[j]) {
					receive[i] = j + 1;
					break;
				}
			}
		}
		
		for (int i : receive) {
			bw.append(i + " ");
		}
		bw.flush();

		bw.close();
	}

}

 

이 처럼 스택을 사용하면 성공!

package com.hw.n2493_탑;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		System.setIn(new FileInputStream("src\\com\\hw\\n2493_탑\\input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());

		StringTokenizer st = new StringTokenizer(br.readLine());

		int top = -1; 
		int [] stack = new int [n];
		int [] tower = new int [n];
		int val;
		
		for (int t = 0; t < n; t++) {
			val = Integer.parseInt(st.nextToken());
			
			while(top>=0) {
				if(tower[top] > val) {
					bw.append((stack[top]+1)+" ");
					break;
				}
				else top --;
			}
			
			if(top<0) bw.append(0 +" ");
			
			stack[++top] = t;
			tower[top] = val;
		}
		bw.flush();

		bw.close();
	}

}

 

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

n2563_색종이  (0) 2021.08.10
[완전탐색] 조합식 문제  (0) 2021.08.05
[스택] 후위 표기식  (0) 2021.08.05
[재귀] 11729 하노이 탑 이동 순서  (0) 2021.08.05
n1244스위치켜고끄기  (0) 2021.08.04
Comments