[문제 이름 : 스택 수열 (백준 1874, S2) ]
문제 url : https://www.acmicpc.net/problem/1874
내가 작성한 코드는 아래와 같다.
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));
int n = Integer.parseInt(br.readLine());
int[] nums = new int[n];
for(int i=0; i<n; i++) {
nums[i] = Integer.parseInt(br.readLine());
}
solution(nums);
}
static void solution(int[] nums) {
Stack<Integer> st = new Stack<>();
StringBuilder sb = new StringBuilder();
int cur = 1;
boolean canResult = true;
for(int i=0; i<nums.length; i++) {
int value = nums[i];
while(cur <= value) {
st.push(cur++);
sb.append("+").append("\n");
}
if(st.peek() == value) {
st.pop();
sb.append("-").append("\n");
} else {
canResult = false;
break;
}
}
if(canResult) {
System.out.println(sb.toString());
} else {
System.out.println("NO");
}
}
}
[풀이 과정]
1. 입력한 수열들을 nums라는 배열에 저장한다.
2. solution() 메소드에서, cur이라는 변수에 1로 초기화한 후, 배열을 순회하며 해당 값을 만들 수 있는지 찾는다.
3. 해당 배열의 값까지 stack에 push를 하고, 이때 Stack의 top에 해당하는 부분에 찾고자 하는 값이 있는지 확인한다. 만약 없으면, 수열을 만들 수 없음을 의미하므로 break;를 이용하여 for문을 벗어난다. 찾고자 하는 값이 있다면, StringBuilder를 이용해 값을 저장하고, 계속해서 다음 배열 값을 계산한다.
4. canResult라는 boolean값을 통해 해당 수열을 만들 수 있는지 판별한다. true라면, StringBuilder에 저장해놓았던 값을 출력하고, false라면, NO를 출력한다.
풀이 시간 : 50분