Problem_Solving

백준(BOJ) 10773 : 제로 (실버4) / 자바(Java) 풀이

CONCAT 2024. 5. 14. 19:36
728x90

문제

https://www.acmicpc.net/problem/10773

3줄 요약

  1. 스택 사용 이유: 스택은 LIFO(Last In, First Out) 특성으로, 가장 최근에 입력된 숫자를 관리하는 데 적합합니다. 0을 만나면 최근 입력값을 제거할 수 있습니다.
  2. 속도 측면: 스택의 삽입과 삭제 연산은 O(1) 시간 복잡도를 가지므로, 전체 알고리즘의 시간 복잡도는 O(K)로, 입력 개수 K에 비례하여 효율적으로 처리할 수 있습니다.
  3. 처리 과정: 입력된 숫자들을 스택에 저장하고 0을 만나면 스택에서 값을 제거하며, 최종적으로 스택에 남은 숫자들의 합을 구하여 출력합니다.

코드

// package boj10773;

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

public class Main {

    public static void main(String[] args) throws Exception {
        // 파일로부터 입력을 읽어오는 코드 (주석 처리 필요 시 주석 해제)
        // System.setIn(new FileInputStream("src/input.txt"));
        // 표준 입력을 통해 데이터를 읽어옴
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 표준 출력을 통해 데이터를 출력함
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 입력받을 정수의 개수 K
        int K = Integer.parseInt(br.readLine());
        // 정수를 저장할 스택 생성
        Stack<Integer> stack = new Stack<>();

        // K개의 정수를 입력받음
        for (int i = 0; i < K; i++) {
            int val = Integer.parseInt(br.readLine());
            if (val == 0) {
                // 입력이 0이면 스택에서 가장 최근의 값을 제거
                stack.pop();
            } else {
                // 입력이 0이 아니면 스택에 값을 추가
                stack.push(val);
            }
        }

        // 스택에 남아있는 모든 정수의 합을 계산
        int sum = 0;
        for (Integer v : stack) {
            sum += v;
        }

        // 결과를 출력 버퍼에 저장
        bw.write(sum + "");
        bw.flush();

        // 리소스 해제
        br.close();
        bw.close();
    }

}