[스택] 스택으로 수열 만들기 / 백준 1874
2024. 7. 13. 13:37ㆍ- 알고리즘/개인공부
문제
https://www.acmicpc.net/problem/1874
풀이
스택에는 자연수를 1부터 오름차순으로 밖에 넣지 못한다. 1부터 차례대러 스택에 push(삽입)하고 pop(빼고)하면서 주어진 수열을 만들수 있는지 + (push), - (pop)으로 표현하면 됩니다. 주어진 수열을 해당 방식으로 만들지 못하면 no를 출력 하면 됩니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
public class 스택으로수열만들기_1874 {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 만들어야할 수열의 길이
int n = Integer.parseInt(br.readLine());
// 스택으로 만들어야할 수열
int[] goalArray = new int[n];
// 수열길이 n 만큼 반복하여 수열 데이터 받기
for (int i = 0; i < n; i++) {
goalArray[i] = Integer.parseInt(br.readLine());
}
// 스택 객체 생성
Stack<Integer> stack = new Stack<>();
// 오름차순으로 스택에 넣을 자연수
int num = 1;
// +, - 를 넣을 stringBuffer
StringBuffer sb = new StringBuffer();
boolean success = true;
for (int i = 0; i < goalArray.length; i++) {
int su = goalArray[i];
if (num <= su) {
while (num <= su) { // 수열값과 자연수값이 같을때까지 자연수를 스택에 넣어줘야함.
// 해당 수열값이 될때까지 스택에 자연수를 오름차순으로 push
stack.push(num++); // 스택에 값을 넣은후에 +1
sb.append("+\n"); // push 할때는 + 출력
}
stack.pop();
sb.append("-\n"); // pop 할때는 - 출력
} else { // 자연수보다 num보다 수열이 작다. 현재자연수 보다 작은 자연수는 이미 스택에 들어가 있기 때문에 작은수는 스택에서 뺀다음에 수열과 같은지 확인
int pop = stack.pop();
sb.append("-\n");
if (pop != su) {
success = false;
bw.write("NO");
break;
}
}
}
if (success) bw.write(sb.toString()); // success true면 수열을 만들었다는 뜻이니까 결과값 출력하면됨
bw.flush();
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
출처
'- 알고리즘 > 개인공부' 카테고리의 다른 글
스택과 큐 (0) | 2024.07.11 |
---|---|
[슬라이딩 윈도우] DNA 비밀번호 / 백준 12891 (0) | 2024.06.22 |
연속된 자연수의 합구하기 [투포인터] / 백준 2018 (0) | 2024.06.19 |
[자료구조] 구간 합 (0) | 2024.06.17 |
[자료구조] 평균 구하기 / 백준 1546 (0) | 2024.06.16 |