반응형
- 풀이
문제의 분류 자체가 스택이기 때문에 스택을 사용해야 한다는 생각이 들기도 하지만, 문제를 잘 읽어보면 정수가 계속 입력될 때 '0'이 입력되면 0이 입력되기 이전의 정수 하나를 지우기 때문에 최근에 입력된 데이터가 가장 먼저 출력되는 LIFO 구조의 스택을 사용해야 한다는 사실을 알 수 있다.
필자는 처음에 모든 정수를 입력받아 스택에 PUSH해준 뒤, POP 해가면서 0이 나오면 한 번 더 POP을 하는 식으로 접근하였지만, 예제 입력 2와 같이 0이 연속으로 입력되는 경우, 최근의 정수를 제대로 지우지 못하기 때문에 입력받을 때 0이면 바로 지워주게끔 풀이하였다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
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 k = Integer.parseInt(br.readLine());
// Stack 객체.
Stack<Integer> stack = new Stack<>();
// 데이터 입력.
for(int i=0;i<k;i++) {
int x = Integer.parseInt(br.readLine());
// 입력 데이터가 0이고, Stack이 비어있지 않다면, 최근의 수를 지워준다.
if(x==0 && !stack.empty()) stack.pop();
// 나머지의 경우는 push 해준다.
else stack.push(x);
}
int sum = 0;
// Stack이 빌 때 까지 누적합을 구한다.
while(!stack.empty()) {
sum+=stack.pop();
}
bw.write(String.valueOf(sum));
bw.flush();
bw.close();
br.close();
}
}
반응형