Study/Algorithm

[BOJ] 백준 1874번: 스택 수열_자바(JAVA)

delay100 2024. 2. 4. 04:15
728x90
반응형

1. 문제

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


2. 접근 및 해결

2-1) 접근

Stack<Integer> stk = new Stack<Integer>();
int num = 1; // (앞으로)  스택에 추가할 값 (1 <= num <= n)
StringBuilder sb = new StringBuilder(); // 출력 가능할 경우 출력할 문자열
boolean isNoTrue = false; // 출력 불가능할 경우 처리를 위한 flag값

 

2-2) 해결

워낙 블로그가 많이 있길래(해결방법도 비슷) 해결에 있어서 계속 틀린 부분만 다뤄보고자합니다!

우선 for과 while문을 섞어서 쓰는 블로그가 많이 있는데, 저는 for문을 2번 사용했습니다.

1. if문으로 조건을 걸 때 주의해야 할 점

안쪽의 반복문(for문)을 감쌀 때 num(앞으로 스택에 추가할 값) < a(현재 input으로 들어 값)라는 조건을 주면 안됩니다.

만약 num이 1이고 a가 1이면 이 for문이 실행되지 않습니다.

입력값으로 아래의 1 1을 넣어보면 "NO"가 출력됩니다.

// if문이 있는 경우 입력
1
1
//			if(num<a) {
			for(int j=num; j<a+1; j++) {
				stk.push(j);
				num++;
				sb.append("+").append("\n");
			} 
//			}

2. StringBuilder에 \n 사용 시 주의할 점

-이거때문에 계속 "틀렸습니다"를 만났습니다..ㅠ

// 실패
sb.append("+\n");
// 맞음
sb.append("+").append("\n");

 


3. 코드(JAVA) 

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

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());
		
		Stack<Integer> stk = new Stack<Integer>();
		int num = 1;
		StringBuilder sb = new StringBuilder();
		boolean isNoTrue = false;
		
		for(int i=0; i<N; i++) {
			int a = Integer.parseInt(br.readLine());
			for(int j=num; j<a+1; j++) {
				stk.push(j);
				num++;
				sb.append("+").append("\n");
			} 
			if(!stk.isEmpty() && stk.peek()==a) {
				stk.pop();
				sb.append("-").append("\n");
			} else {
				isNoTrue = true;
                break; // 없어도 됨
			}
		}
		if(isNoTrue) {
			bw.write("NO");
		} else {
			bw.write(sb.toString());
		}
		
		br.close();
		bw.close();
	}
}

 

 

 

 

728x90
반응형