본문 바로가기
코딩/백준-자바

[자바] 백준 9017번: 크로스 컨트리

by 철없는민물장어 2023. 2. 26.
728x90
반응형

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

 

9017번: 크로스 컨트리

입력 데이터는 표준입력을 사용한다. 입력은 T 개의 테스트 케이스로 주어진다. 입력 파일의 첫 번째 줄에 테스트 케이스의 수를 나타내는 정수 T 가 주어진다. 두 번째 줄부터는 두 줄에 하나의

www.acmicpc.net

 

구현 문제이다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.StringTokenizer;

public class P9017 {
	static class Team {
		int teamNum = 0;
		int count = 0;
		int fifth = 0;
		int score = 0;

	}

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

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int testCase = Integer.parseInt(br.readLine());
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		for (int T = 0; T < testCase; T++) {

			HashSet<Integer> failTeam = new HashSet<>();// 인원수부족팀
			Team[] list = new Team[201];
			int n = Integer.parseInt(br.readLine());

			int[] scoreboard = new int[n + 1];

			StringTokenizer st = new StringTokenizer(br.readLine());

			for (int i = 1; i <= n; i++) {
				int now = Integer.parseInt(st.nextToken());

				scoreboard[i] = now;

				if (list[now] == null) {
					list[now] = new Team();
					list[now].teamNum = now;
					// System.out.println("팀생성"+i+"번쨰,"+list[now].teamNum);
				}

				list[now].count++;
				// 입력받고 팀원 수만 먼저 세자.
//				list[now].score += i;
//
//				if (list[now].count == 5) {
//					list[now].fifth = i;
//				}
			}

			for (int i = 1; i <= 200; i++) {
				if (list[i] != null) {
					if (list[i].count < 6)
						failTeam.add(i);
					list[i].count = 0;// 초기화
				}
			} // 탈락팀 선정

			int score = 0;
			for (int i = 1; i <= n; i++) {
				int now = scoreboard[i];
				if (failTeam.contains(now))
					continue;

				score++;
				list[now].count++;
				if(list[now].count<=4)	
					list[now].score += score;
//				System.out.println("score+="+score);
//				System.out.println("team1:"+list[1].score);
//				System.out.println("team3:"+list[3].score);
				if (list[now].count == 5)
					list[now].fifth = i;// 팀에서 5등하는 선수의 등수 기록

			}

			Arrays.sort(list, new Comparator<Team>() {

				@Override
				public int compare(Team o1, Team o2) {
					if (o1 == null && o2 == null)
						return 0;

					if (o1 == null)
						return 1;
					if (o2 == null)
						return -1;

					if (o1.score == o2.score)
						return o1.fifth - o2.fifth;
					return o1.score - o2.score;
				}
			});

			for (int i = 0; i <= 200; i++) {
				if (list[i] != null) {
					if (list[i].count == 6) {
						bw.append(list[i].teamNum+"\n");
						break;
						//System.out.println(list[i].teamNum+"팀의 점수: "+list[i].score);
					}
				}
			}
			

		}
		bw.flush();
	}

}

내 코드를 알아보기 쉬웠으면 해서 Team 클래스를 만들어 팀정보를 관리하려고 했는데

그러다 보니 코드가 많이 길어진 경향이 있다.

 

우선 Team클래스는 각 객체마다 count(팀원 수), score(점수), teamNum(팀 번호), fifth(팀 내 5등의 등수)를 저장한다.

 

처음 입력을 받고 나서는 각 팀마다의 인원수만 센다.

팀의 인원이 6명이 되지 않는 팀은 

HashSet에 해당 팀명을 넣어서 탈락팀으로 선정했다.

 

다시 순위표로 돌아가서 1등부터 한명씩 살펴보는데,

현재 사람이 속한 팀이 탈락팀에 속해있다면 continue로 넘어가고

그렇지 않다면 팀정보를 수정해준다.

(이 때 수정하는 정보는 팀원 수, 점수, 5등의 등수이다.)

팀 점수를 수정할 때는 주의사항이 있는데,

팀 내 상위 4명의 점수만 더해야 한다는 점이다.

현재 팀의 count값을 보고, 이미 4명의 점수를 더했다면 팀점수를 더하지 않고 넘어가야한다.

 

728x90
반응형

댓글