본문 바로가기

알고리즘

[알고리즘/Goorm] LV2. 체크 카드 (Java)

728x90
반응형

 

오늘의 학습 키워드

  • 큐(Queue)

오늘의 회고

1. 문제

문제 URL

 

구름LEVEL

난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다.

level.goorm.io

2. 해결 방안

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

/**
 * [구름] LV2. 체크 카드 (큐)
 */
public class CheckCard {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int balance = Integer.parseInt(input[0]); // 최종 출력할 잔액
        int historySize = Integer.parseInt(input[1]);
        List<String[]> history = new ArrayList<>();
        for (int i = 0; i < historySize; i++) {
            history.add(br.readLine().split(" "));
        }
        // 대기열
        Queue<Integer> q = new LinkedList<>();

        for (int i = 0; i < historySize; i++) {
            String label = history.get(i)[0];
            int money = Integer.parseInt(history.get(i)[1]);

            if ("deposit".equals(label)) {
                balance += money;
                // 입금 후 바로 대기 목록 작업
                while (!q.isEmpty() && q.peek() <= balance) {
                    balance -= q.poll();
                }
            } else if ("pay".equals(label)) {
                if (balance >= money) {
                    balance -= money;
                }
            } else { // reservation
                if(!q.isEmpty() || balance < money) { // 대기열이 비어있지 않거나, 잔액보다 머니가 크면 대기열에 넣기
                    q.add(money);
                }else {
                    balance -= money;
                }
            }

        }

        System.out.println(balance);
    }
}

 

  • 큐로 예약 상태에 대한 대기열을 만들어서 순차적으로 상태를 처리하게 한다.
  • 각 if 문으로 조건을 나눠 로직처리를 하면 된다.
    • deposit 에서 입금 처리 후 바로 대기 목록 작업을 수행시킨다. 큐에 값이 있고 잔액과 큐 값을 비교해 출금 처리가 가능하다면 큐를 빼고 잔액을 업데이트 시키는 것을 반복한다.
    • pay 에서는 잔액을 뺄 수 있을 경우만 뺀다.
    • reservation 에서는 두가지를 고려해야 한다. 1) 잔액 출금 안되거나 2) 대기열에 값이 하나라도 존재한다면 무조건 대기열에 넣는다. 1,2 해당되지 않는다면 잔액 출금 처리.

3. 피드백

  • 잘못 했던 부분
    • 대기 목록 작업 돌리는 부분(while문)을 for문 초반(if문 전)과 최종 출력 전에 한번 더 돌렸었다.(총 2번) 현재처럼 deposit 조건문 하단에서 바로 돌리면 되었다.
    • reservation 조건문에서 대기열이 비어있지 않는 경우도 조건으로 주는 것도 놓쳤었다. (reservation 요구사항을 미충족 했음)
  • 다 푼줄 알았는데 수정 전에는 테케 3개 통과를 못했었다. 요구사항 놓치지 않고 잘 보자.
728x90
반응형