728x90
반응형
https://www.acmicpc.net/problem/9017
구현 문제이다.
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
반응형
'코딩 > 백준-자바' 카테고리의 다른 글
[자바] 백준 20920번: 영단어 암기는 괴로워 (0) | 2023.02.27 |
---|---|
[자바] 백준 2164번: 카드2 (0) | 2023.02.27 |
[자바] 백준 1244번: 스위치 켜고 끄기 (0) | 2023.02.25 |
[자바] 백준 20125번: 쿠키의 신체 측정 (0) | 2023.02.24 |
[자바] 백준 25757번:임스와 함께하는 미니게임 (1) | 2023.02.23 |
댓글