백준

백준 스택 - 1874번 : 스택 수열

맴썰 2022. 2. 28. 17:53

https://www.acmicpc.net/problem/1874

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net


import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		int[] target = new int[n];
		int[] result = new int[n];
		StringBuilder ans = new StringBuilder();
		int cur = 0;
		int idx = 0;
		StringBuilder str = new StringBuilder();
		for(int i=0; i<n; i++) {
			target[i] = Integer.parseInt(br.readLine());
			str.append(target[i]);
		}
		Stack<Integer> s = new Stack<>();
		int num=1;
		while(idx<n) {
			if(target[cur]>num) {
				s.push(num);
				ans.append("+\n");
				num++;
				continue;
			}
			if(target[cur]==num){
				s.push(num);
				ans.append("+\n");
				int temp = s.pop();
				ans.append("-\n");
				result[idx++] = temp;
				cur++;
				num++;
				continue;
			}
			if(target[cur]<num) {
				int temp = s.pop();
				ans.append("-\n");
				result[idx++] =temp;
				cur++;
				continue;
			}
			
		}
		String temp = Arrays.toString(result).replaceAll("[^0-9]","");
		if(!temp.equals(str.toString()))bw.write("NO");
		else {
			bw.write(ans+"");
		}
		bw.close();
	}
}

 

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int n = Integer.parseInt(br.readLine());
		int[] target = new int[n];
		StringBuilder ans = new StringBuilder();
		int cur = 0;
		StringBuilder str = new StringBuilder();
		for(int i=0; i<n; i++) {
			target[i] = Integer.parseInt(br.readLine());
			str.append(target[i]);
		}
		Stack<Integer> s = new Stack<>();
		for(int i=1; i<=n; i++) {
			s.push(i);
			ans.append("+\n");
			while(!s.isEmpty()&&s.peek()==target[cur]) {
				s.pop();
				ans.append("-\n");
				cur++;
			}
			
		}
		if(!s.isEmpty())bw.write("NO");
		else {
			bw.write(ans+"");
		}
		bw.close();
	}
}

받을 숫자가 하나일 경우 stringbuilder 사용하지 않고 바로 readline을 int로

Stringbuilder는 그대로 출력할 수 있다.