Algorithm/백준 자바

백준 10773 자바

눈오는1월 2024. 4. 20. 20:42
728x90

<문제>

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

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net

<풀이>

1. 어떤 접근으로 문제를 접근하려고 했는지

0을 부를 때마다 직전의 적었던 번호를 지워야 한다. 즉 맨 마지막번째 숫자를 가지고 넣고 지우는 행위를 반복하는 문제이다. 

LIFO인 Stack을 활용하는 것이 효과적이라고 생각했다. (물론 일반적인 list도 가능하긴 하다)
2. 향상된 for문을 이용해 Stack의 모든 값들을 접근해서 다 더한 값을 구하려고 했다.

 

2. 문제를 해결하기 위한 기능
1) 0일 때 직전의 숫자를 삭제하는 기능

2) 입력이 끝났을 때 Stack에 남아있는 숫자를 더하는 기능

<코드>

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));
        StringBuilder sb = new StringBuilder();
        Stack<Integer> stack = new Stack<>();
        int n = Integer.parseInt(br.readLine());
        for(int i = 0; i < n; i++) {
            int num = Integer.parseInt(br.readLine());
            if(num == 0) { // 0일때 직전의 값을 지우는 기능
                stack.pop();
            }
            else {
                stack.push(num);
            }
        }
        int sum = 0;
        for(int e : stack) { // 스택의 합 구하기
            sum += e;
        }
        System.out.println(sum);
    }
}

<후기>

스택은 인덱스로 접근하기 힘들기 때문에 위처럼 향상된 for문을 이용해서 접근했다.

향상된 for문은 Iterator로 접근하기 때문에 각 스택의 값들을 접근할 수 있다.

728x90