Algorithm, Problem Solving/백준(boj)

[백준][Java] 2852 - NBA 농구

태오님 2024. 4. 22.

1. 문제 정보

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

 

2852번: NBA 농구

첫째 줄에 골이 들어간 횟수 N(1<=N<=100)이 주어진다. 둘째 줄부터 N개의 줄에 득점 정보가 주어진다. 득점 정보는 득점한 팀의 번호와 득점한 시간으로 이루어져 있다. 팀 번호는 1 또는 2이다. 득

www.acmicpc.net

난이도 : S3

유형 : 문자열, 자료구조

시간 : O(N)


2. 문제 풀이

1팀, 2팀의 득점 시간을 각각의 덱에 저장하면서 진행한다.

득점 점수는 덱의 사이즈로 판별하면 되고

 

동점 상황 발생 시

1팀이 최근 득점에 성공했을 시 '1팀의 마지막 득점시간 - 2팀의 처음 득점시간'을 2팀의 총합 시간에 추가

2팀이 최근 득점 시, 반대로 1팀의 총합 시간에 추가하면 된다.

해당 팀의 총합 시간에 시간을 추가 후 1팀과 2팀의 덱에 있는 모든 득점 시간을 삭제한다.

 

N번 반복 후

마지막으로, 각 팀의 덱의 사이즈를 비교하여 덱의 사이즈가 큰 팀에게 '총 게임시간 - 덱의 마지막 득점 시간'을 해당 팀의 총합 시간을 추가한다.

 

ex

3 - 1) 1팀 -> 1팀 -> 1팀 -> 2팀 일시 동점의 상황이 발생하지 않은 경우

 

코드를 보면 이해가 쉬울 것이다.


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

public class Main {

    public static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static final StringBuilder sb = new StringBuilder();
    public static StringTokenizer st;

    public static final int TOTAL_GAME_SECOND = 48 * 60;

    int N;
    ArrayDeque<Integer> dqA;
    ArrayDeque<Integer> dqB;
    int totalA;
    int totalB;

    private String convertSecondToString(int totalTime) {

        int min = totalTime / 60;
        int second = totalTime % 60;

        StringBuilder sb = new StringBuilder();
        sb.append(String.format("%02d", min)).append(":").append(String.format("%02d", second));
        return sb.toString();
    }

    private int convertStringToSecond(String timeString) {

        String[] time = timeString.split(":");
        return Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
    }

    private void solution() throws IOException {

        dqA = new ArrayDeque<>();
        dqB = new ArrayDeque<>();
        totalA = 0;
        totalB = 0;

        N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int team = Integer.parseInt(st.nextToken());
            int second = convertStringToSecond(st.nextToken());

            if (team == 1) {
                dqA.addLast(second);
                if (dqA.size() == dqB.size()) { // 동점 발생
                    totalB += dqA.peekLast() - dqB.peekFirst();
                    dqA.clear();
                    dqB.clear();
                }
            } else {
                dqB.addLast(second);
                if (dqA.size() == dqB.size()) { // 동점 발생
                    totalA += dqB.peekLast() - dqA.peekFirst();
                    dqA.clear();
                    dqB.clear();
                }
            }
        }

        if (dqA.size() > dqB.size()) {
            totalA += TOTAL_GAME_SECOND - dqA.peekFirst();
        } else if (dqA.size() < dqB.size()) {
            totalB += TOTAL_GAME_SECOND - dqB.peekFirst();
        }

        sb.append(convertSecondToString(totalA)).append("\n").append(convertSecondToString(totalB));
        System.out.println(sb);
    }

    public static void main(String[] args) throws IOException {

        Main main = new Main();
        main.solution();
    }
}

댓글