문제

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

 

9017번: 크로스 컨트리

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

www.acmicpc.net

 

 

문제 접근

  • 점수를 구할 때 6인보다 적은 팀은 점수 계산에 상정되지 않는다는 것을 유의해야 한다. 이는 즉 입력에서부터 각 팀원당 몇 명이 소속 되어 있는지를 확인해야 한다.
  • 또한 상위 4인 까지의 점수의 합으로 먼저 판단한 뒤 동점이 나올 시 5번째로 들어온 사람의 점수를 사용하여 최종적으로 판별하는 것을 유의해야 한다.
  • Map을 사용하면 매우 쉽게 구현이 가능한 문제였다. 정렬을 통해 최종 우승을 가려야 하는데 정렬 시 2개의 조건을 사용해야 하므로 람다를 통해 구현하였다.

 

 

해결 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int T = Integer.parseInt(br.readLine());

    for (int testCase = 0; testCase < T; testCase++){
      int N = Integer.parseInt(br.readLine());
      int[] rank = new int[N];
      Map<Integer, Integer> result = new HashMap<>();

      StringTokenizer st = new StringTokenizer(br.readLine());
      for (int i = 0; i < N; i++){
        int data = Integer.parseInt(st.nextToken());
        result.put(data, result.getOrDefault(data, 0) + 1);
        rank[i] = data;
      }

      int[] fifthGoalIdx = new int[result.size() + 1];
      Map<Integer, Integer> scoreMap = new HashMap<>();
      Map<Integer, Integer> tempMap = new HashMap<>();
      int score = 1;

      for (int element: rank){
        if (result.get(element) >= 6){
          tempMap.put(element, tempMap.getOrDefault(element, 0) + 1);

          if (tempMap.get(element) <= 4){
            scoreMap.put(element, scoreMap.getOrDefault(element, 0) + score);
          }

          if (tempMap.get(element) == 5){
            fifthGoalIdx[element] = score;
          }
          score++;
        }
      }

      List<Integer> keyData = new ArrayList<>(scoreMap.keySet());
      keyData.sort((x, y) -> {
        if (Objects.equals(scoreMap.get(x), scoreMap.get(y))){
          return fifthGoalIdx[x] - fifthGoalIdx[y];
        } else{
          return scoreMap.get(x) - scoreMap.get(y);
        }
      });

      System.out.println(keyData.get(0));
    }
  }
}
  • 람다를 구현할 때 scoreMap.get(x) == scoreMap.get(y)로 비교를 수행했었는데 알고 보니 해당 방식은 객체 참조 주소를 사용하여 비교하는 것이였다. 이것 때문에 꽤 해매었던 것 같다.
복사했습니다!