백준 28278. 스택

신형석·2025년 7월 21일
0

알고리즘 풀이

목록 보기
41/41

문제

현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 쓰기로 하였다. 현우는 통장에서 K원을 인출하며, 통장에서 뺀 돈으로 하루를 보낼 수 있으면 그대로 사용하고, 모자라게 되면 남은 금액은 통장에 집어넣고 다시 K원을 인출한다. 다만 현우는 M이라는 숫자를 좋아하기 때문에, 정확히 M번을 맞추기 위해서 남은 금액이 그날 사용할 금액보다 많더라도 남은 금액은 통장에 집어넣고 다시 K원을 인출할 수 있다. 현우는 돈을 아끼기 위해 인출 금액 K를 최소화하기로 하였다. 현우가 필요한 최소 금액 K를 계산하는 프로그램을 작성하시오.


입력

1번째 줄에는 N과 M이 공백으로 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ M ≤ N)

2번째 줄부터 총 N개의 줄에는 현우가 i번째 날에 이용할 금액이 주어진다. (1 ≤ 금액 ≤ 10000)


출력

첫 번째 줄에 현우가 통장에서 인출해야 할 최소 금액 K를 출력한다.


이전에는 전부 C/C++로 코드를 작성해왔지만, JAVA로 언어를 변경해야 할 것 같아서 오랜만에 JAVA 복기도 할 겸 풀어본 문제.

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 T = Integer.parseInt(br.readLine());
        
        Stack<Number> stack = new Stack<>();
        
        // 각 테스트케이스 처리
        for (int t = 0; t < T; t++) {
            String line = br.readLine().trim();
            
            // 공백으로 분리
            String[] tokens = line.split(" ");
            
            if (tokens.length == 1) 
            {
                // 숫자 하나인 경우
                int num = Integer.parseInt(tokens[0]);
                if (num == 2)
                {
                	System.out.println(stack.isEmpty()? -1 : stack.pop());
                }
                else if (num == 3)
                {
                	System.out.println(stack.size());
                }
                else if (num == 4)
                {
                	System.out.println(stack.isEmpty()? 1 : 0);
                }
                else if (num == 5)
                {
                	System.out.println(stack.isEmpty()? -1 : stack.peek());
                }
            }
            else if (tokens.length == 2)
            {
            	stack.add(Integer.parseInt(tokens[1]));
            }
        }
        
        br.close();
	}
}

JAVA를 처음 배울때는 Scanner로 입력을 받아왔지만, Scanner를 사용하는 방법은 생각보다 시간을 많이 잡아먹는다고 한다. 그래서, BufferedReader를 사용한다.

BufferedReader를 이용하면, 한 줄에 입력된 모든 데이터를 받아올 수 있다. 대신, 정수형으로 받아오는 것이 아니기 때문에 파싱 처리한 후 형변환을 해줘야 한다.

한 줄에 여러 테스트케이스가 있는 경우, 한 줄을 받아온 후 Split 함수를 통해 공백을 기준으로 나눈다. 그 후, 나눈 문자열을 하나씩 확인하면 된다.


JAVA 내부에서 Stack을 지원해주기 때문에, 그대로 사용했다.
문제의 조건을 잘 보고, 각 함수가 어떤 기능을 하는지 확인하면 좋을 것 같다.

1개의 댓글

comment-user-thumbnail
2025년 10월 16일

이 글을 본사람은 이 글을 복사하여 10곳에 보내지 않으면 불행이 찾아옵니다..
이 글은 영국에서부터 시작되어 어쩌구 ..

답글 달기