알고리즘||코딩테스트/백준

[백준 2852번] NBA 농구 - JAVA

째로스 2023. 7. 27. 11:22

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

 

2852번: NBA 농구

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

www.acmicpc.net

풀이

구현 문제

 

풀이전략

※이기고 있던 시간을 계산해야 하는 경우

1) 어떤 팀이 이기고 있다가 상대팀의 득점으로 인해  동점이 되는 경우

2) 어떤 팀이 이기고 있다가 경기가 종료된 경우

 

1. 1팀과 2팀 각각의 점수를 기록해두는 변수를 선언한다.

2. 특정 팀의 득점으로 상대 팀보다 큰 점수를 가질 경우,

    상대팀이 지기 시작한 시간을 저장한다.

3. 특정 팀의 득점으로 동점이 된경우, 득점한 시점에서 득점한 팀이 저장해둔 지기 시작한 시간을 뺀

    시간(MiliSecond)을 득점을 당한 팀의 이기고 있던 시간에 더해준다.

4. 2~3번 과정을 경기가 끝날 때까지 반복한다.

5. 경기가 끝났으면서 동점이 아닌 경우, 종료 시점에서 지고 있던 팀이 저장해둔 지기 시작한 시간을

   이긴 팀의 이기고 있던 시간에 추가한다.

6. 1번팀과 2번팀의 이기고 있던 시간을 추가한다.

 

- SimpleDateFormat 클래스를 통해 Date 객체의 형식 설정("mm:ss") 및 Date->Milisecond,

   Milisecond->Date로의 형변환이 가능했음

- getTime을 했을 때 반환되는 수가 음수가 나왔었다. 이는 한국 시간의 오류로 32400000를 

  더해주어 해결했다.

 

제출코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.StringTokenizer;

public class Main {
    public static void main(String args[]) throws IOException, ParseException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");

        int score[] = new int[3];
        long pTimeMil[] = new long[3];
        long sumTimeMil[] = new long[3];
        boolean maintainWin[] = new boolean[3];

        int N=Integer.parseInt(br.readLine());
        for(int i=0;i<N;++i){
            st=new StringTokenizer(br.readLine());
            int team = Integer.parseInt(st.nextToken());
            Date date = sdf.parse(st.nextToken());
            //Date를 MiliSecond로
            long cTimeMil=date.getTime()+32400000;

            ++score[team];
            // 1번팀이 앞질렀을 경우
            if(score[1]>score[2] && team==1 && maintainWin[1]==false){
                pTimeMil[2]=cTimeMil;
                maintainWin[1]=true;
                maintainWin[2]=false;
            }
            // 2번팀이 앞질렀을 경우
            else if(score[1]<score[2] && team==2 && maintainWin[2]==false){
                pTimeMil[1]=cTimeMil;
                maintainWin[2]=true;
                maintainWin[1]=false;
            }
            // 동점이 된 경우
            else if(score[1]==score[2]){
                if(team==1){ // 1번 팀이 득점해서 동점이된 경우
                    sumTimeMil[2]+=(cTimeMil-pTimeMil[1]);
                }
                else{ // 2번 팀이 득점해서 동점이된 경우
                    sumTimeMil[1]+=(cTimeMil-pTimeMil[2]);
                }
                maintainWin[1]=false;
                maintainWin[2]=false;
            }
        }
        //경기 끝났을 때 이기고 있는 팀 시간 추가
        Date date = sdf.parse("48:00");
        long cTimeMil=date.getTime()+32400000;
        if(score[1]>score[2]){
            sumTimeMil[1]+=(cTimeMil-pTimeMil[2]);
        }
        else if(score[1]<score[2]){
            sumTimeMil[2]+=(cTimeMil-pTimeMil[1]);
        }

        //Milisecond를 date로
        Date timeInDate = new Date(sumTimeMil[1]);
        System.out.println(sdf.format(timeInDate));
        Date timeInDate2 = new Date(sumTimeMil[2]);
        System.out.println(sdf.format(timeInDate2));
    }
}