알고리즘/구현 & 그리디 & 브루트포스

[백준]JAVA - 10773번: 제로

K.두부 2022. 11. 21. 23:48
반응형

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

 

10773번: 제로

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

www.acmicpc.net

 

풀이

문제의 조건은 매우 간단하다.

0이 등장하면 전에 입력받았던 숫자를 지우면 된다. 

또한, 0이 등장했을 땐 지울 수 있는 숫자가 있음을 보장했기 때문에 예외 처리를 해줄 필요도 없다.

 

문제를 푸는 방법은 2가지가 있다.

 

1. 스택 (Stack) 을 이용하는 방법

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

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());
		
        Stack<Integer> st = new Stack<>();
        for (int i=0; i<N; i++) {
            int num = Integer.parseInt(br.readLine());
						
            if (num == 0) { // 제거
                st.pop();
            } else {        // 추가
                st.push(num);
            }
        }
		
        int ans = 0;
        for (int i=0; i<st.size(); i++) {
            ans += st.get(i);
        }
		
        System.out.println(ans);
    }
}

자바에서 제공하는 스택 클래스를 이용하면 쉽게 해결할 수 있다. 예외처리도 없어서 그냥 0이 들어오면 pop(), 다른 값이 들어오면 push() 를 해주면 된다.

 

2. int형 배열을 이용하는 방법 (구현)

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 top = -1;
        int[] arr = new int[N];
			
        for (int i=0; i<N; i++) {
            int num = Integer.parseInt(br.readLine());
			
            if (num == 0) {
                top--;
            } else {
                top++;
                arr[top] = num;
            }
        }
		
        int ans = 0;
        for (int i=0; i<=top; i++) {
            ans +=  arr[i];
        }
		
        System.out.println(ans);
    }
}

해당 문제는 스택 클래스에 대해서 알지 못해도 int형 배열을 스택처럼 활용해서 해결할 수 있다. 들어오는 값에 따라서 인덱스값만 제어해주면 된다. 0이 들어오면 인덱스값을 -1 해준다. 0이 아닌 값이 들어오면 인덱스값을 +1 해주고 값을 넣는다. 주의할 점은 출력하는 부분에서 0부터 인덱스값(top)까지만 출력해야한다.

반응형