본문 바로가기

Problem Solving

백준 10773 제로 - Java 자바 문제풀이

문제 해설

문제에서 주어지는 정수들을 모두 더한 합을 구하는 문제입니다. 단, 0이 입력 될 때 마다 가장 마지막에 불렀던 숫자를 합계에서 빼야 합니다.

 

문제 풀이 계획

필요 변수

변수명 타입 초기값 설명
K int   첫째 줄에 주어지는 정수
sum int 0 부른 숫자를 모두 더한 합
(문제에서 수의 합이 2^31-1 보다 작다고 했으므로 int 형을 사용해도 된다.)
arr int[]   부른 숫자를 저장할 배열
pos int 0 배열의 마지막 인덱스를 가리키는 변수

 

해결 로직

  1. K를 입력 받는다.
  2. K 번 만큼 숫자를 입력 받는다.
  3. 0이라면 arr[--pos] (배열의 가장 마지막 인덱스 원소)를 sum에서 뺀다.
  4. 0이 아니라면 arr[pos]에 숫자를 삽입하고 sum에 더한다.
  5. sum을 출력한다.

 

풀이 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static int K;
	public static int sum = 0;
	public static int[] arr;
	public static int pos = 0;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		// 1. K를 입력 받는다.
		K = Integer.parseInt(st.nextToken());
		arr = new int[K];
		
		while(K-- > 0) {
			// 2. K 번의 명령어를 입력 받는다.
			st = new StringTokenizer(br.readLine());
			
			while(st.hasMoreTokens()) {
				// 3. 숫자에 따라 분기 처리한다. 
				int num = Integer.parseInt(st.nextToken());
				
				if(num == 0) {
					sum -= arr[--pos]; // pos-1 한 후 arr[pos]값을 sum에서 뺀다.
				} else {
					arr[pos++]=num; // arr[pos]에 값을 삽입 후 pos+1 한다.
					sum+=num;
				}
			}
		}
		
		// 4. 출력한다
		System.out.println(sum);
	}	
}

 

위: println / 아래: BufferedWriter

이번 문제처럼 출력이 단순한 문제의 경우, BufferedWriter 대신 System.out.print를 사용해도 무방할 것 같습니다.

 

 

10773번: 제로

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

www.acmicpc.net