java 알고리즘 문제 풀이 - NBA농구

박경현·2023년 10월 2일
0

백준의 2852번 문제인 NBA농구 문제에 대한 내용을 적어보려고 한다.

사실 문자열 관련 문제여서 쉽게 풀겠구나 싶었는데 생각정리를 제대로 못해서 결국
못 풀고 답을 보게 되었다.

내가 분석하면서 알게 된것과 놓친 것, 그리고 앞으로 관련 문제들을 어떻게 풀어야할지 정리해보려고 한다!

문제 및 문제 해설

NAB농구 문제

문제는 1팀과 2팀 중 이긴 팀의 시간을 순서대로 적는 것이다.
입력에는 공 넣은 팀과 공 넣은 시간이 주어진다
48분 동안 하는 경기이며 득점시간이 겹치는 경우는 없다.

풀이 설명

일단 맨처음 골을 넣은 팀의 정보를 저장할 클래스가 필요하다

클래스가 필요한 이유는 팀과 시간을 저장해야하기 때문이다!

그리고 팀의 점수 누적시간을 각각의 팀 시간에 누적시킨다.

마지막에 각각 1팀과 2팀의 누적시간을 분과 초로 구별해서 출력한다!

코드

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

public class b5852 {
	static int N;
    public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        N = Integer.parseInt(br.readLine());
        
        int win_team;
        int min_time;
        int [] ans_score = {0,0};
        int [] ans_time = {0,0};
        Record [] records = new Record[N];
        
        for (int i = 0; i < N; i++) {
        	StringTokenizer st = new StringTokenizer(br.readLine());
            win_team = Integer.parseInt(st.nextToken());
            String [] tmp = st.nextToken().split(":");
            min_time = Integer.parseInt(tmp[0])*60 + Integer.parseInt(tmp[1]);
            
            records[i] = new Records(win_team, min_time);
        }
        
        ans_score[records[0].team - 1]++;
        min_time = records[0].time;
        
        for (int i = 1; i < N; i++) {
        	int tmp_team = records[i].team;
            int tmp_time = records[i].time;
            
        	if (ans_score[0] > ans_score[1] ) {
            	ans_time[0] = tmp_time - min_time;
            }
            if (ans_score[1] > ans_score[0] ) {
            	ans_time[1] = tmp_time - min_time;
            }
            
            min_time = tmp_time;
            ans_score[tmp_team - 1]++;
            
        }
        
        if (ans_score[0] > ans_score[1]) {
            ans_time[0] += (48 * 60 - min_time);
        }
        if (ans_score[0] < ans_score[1]) {
            ans_time[1] += (48 * 60 - min_time);
        }
        
        for (int i = 0; i< 2; i++) {
            int minute = ans_time[i] / 60;
            int second = ans_time[i] % 60;

            String mi;
            String se;

            if (minute < 10) {
                mi = "0" + Integer.toString(minute);
            }else {
                mi = Integer.toString(minute);
            }

            if (second < 10) {
                se = "0" + Integer.toString(second);
            }else {
                se = Integer.toString(second);
            }
            System.out.println(mi + ":" + se);
        }
    }
    
}
class Record {
	int team;
    int time;
    
    public Record(int team, int time) {
    	this.team = team;
        this.time = time;
    }
}

코드 설명

  1. 입력에 1(골넣은 팀) 24:30(분과 초) 이렇게 들어오기 때문에
    팀과 시간을 저장할 클래스인 Record를 만들었습니다. 여러개 들어오기 때문에 배열로도 만들었습니다.

  2. 각각의 팀과 시간을 넣어준 후 처음 골을 넣은 팀과 시간을 ans_score와 min_time에 저장했습니다.
    이유는 먼저 넣은 애들이 가장 빠른 시간이어서 이후에 누적이 되기 때문입니다.

  3. 그리고 N까지 반복해서 상대가 이겼다면 현재 골넣은 시간 - 그 전 시간 을 해줬습니다.

  4. 마지막으로 시간과 분을 나눠서 출력했습니다.

피드백

팀과 시간을 함께 저장하는 방법으로 단순히 배열을 생각했었는데
클래스를 사용하면 더 직관적으로 내가 원하는 객체를 만들 수 있구나를 제대로 깨달았습니다.

그리고 누적이라는 단어를 제대로 이해 못해서 += 가 아닌 =로 적었었는데 문제에 대한 완벽한
이해를 먼저하고 -> 알고리즘을 짠 뒤 -> 코드를 짜야겠습니다.

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글