본문으로 바로가기

백준 1874번 스택수열 java

category Algorithm by java 2019. 9. 4. 21:04

문제

스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 제일 나중에 들어간 자료가 제일 먼저 나오는 (LIFO, Last in First out) 특성을 가지고 있다.

1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하라.

입력

첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄부터 n개의 줄에는 수열을 이루는 1이상 n이하의 정수가 하나씩 순서대로 주어진다. 물론 같은 정수가 두 번 나오는 일은 없다.

출력

입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. push연산은 +로, pop 연산은 -로 표현하도록 한다. 불가능한 경우 NO를 출력한다.

 

 

 

스택 수열문제.

스택에 n만큼 push해주면서 +를 추가해준다.  push도중 찾는 숫자를 만났다면  - 를 추가해준다.

처음에 while문과 if문중 헷갈렸는데 a[m] 의 숫자가 현재 스택에 저장되어있는 peek의 숫자보다 작을 경우를 고려해서 while문을 사용해야 한다.

 

 

 

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;

public class Exam1874 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Stack st = new Stack();
		ArrayList ans = new ArrayList();
		int n = sc.nextInt();
		int[] a = new int[n + 1]; // 0을 사용하지 않기 때문에 +1을 해줌
		int m = 1;
		for (int i = 1; i <= n; i++) {
			a[i] = sc.nextInt();
		}

		for (int i = 1; i <= n; i++) {
			st.push(i);
			ans.add("+");
			while (!st.empty() && st.peek() == a[m]) {
				st.pop();
				ans.add("-");
				m++;
			}
		}

		if (st.empty()) {
			for (String s : ans) {
				System.out.println(s);
			}
		} else {
			System.out.println("NO");
		}

	}
}

'Algorithm by java' 카테고리의 다른 글

백준 17413번 단어뒤집기 2 java  (2) 2019.09.08
백준 1406번 에디터 java  (1) 2019.09.04
백준 9093 단어뒤집기 java  (0) 2019.09.04
백준 1057번 토너먼트 java  (0) 2019.09.02
백준 2869번 java 달팽이  (0) 2019.09.01