devFancy BE Developer

[Programmers] 42889. 실패율

2023-01-26
devfancy

문제 링크

성능 요약

메모리: 78.8 MB, 시간: 0.67 ms

구분

코딩테스트 연습 > 2019 KAKAO BLIND RECRUITMENT

Answer Code1(23.01.26)

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Solution {
  public int[] solution(int N, int[] lastStages) {
    int nPlayers = lastStages.length;
    int[] nStagePlayers = new int[N + 2];
    for (int stage : lastStages) {
      nStagePlayers[stage] += 1;
    }

    int remainingPlayers = nPlayers;
    List<Stage> stages = new ArrayList<>();
    for (int id = 1 ; id <= N; id++) {
      double failure = (double) nStagePlayers[id] / remainingPlayers;
      remainingPlayers -= nStagePlayers[id];

      Stage s = new Stage(id, failure);
      stages.add(s);
    }
    Collections.sort(stages, Collections.reverseOrder());

    int[] answer = new int[N];
    for (int i = 0; i < N; i++) {
      answer[i] = stages.get(i).id;
    }
    return answer;
  }

  class Stage implements Comparable<Stage> {
    public int id;
    public double failure;

    public Stage(int id_, double failure_) {
      id = id_;
      failure = failure_;
    }

    @Override
    public int compareTo(Stage o) {
      if (failure < o.failure ) {
        return -1;
      }
      if (failure > o.failure ) {
        return 1;
      }
      return 0;
    }
  }
}

문제풀이

  • 실패율이 높은 stage부터 내림차순으로 stage의 번호가 담겨있는 배열을 출력하는 문제이다.

  • 실패율 = stage에 도달했으나 아직 클리어하지 못한 플레이어의 수 / stage에 도달한 플레이어 수

  • 실패율을 구한 다음 내림차순으로 정렬하여 반환하는 것이 목표다.

  • 흐름 구성

    • 각 스테이지에 머무르고 있는 사람의 수를 카운팅한다.

    • 각 스테이지를 플레이한 사람의 수를 카운팅한다.

    • 각 (스테이지에 머무르고 있는 사람 / 각 스테이지를 플레이 한 사람) * 100으로 실패율을 계산한다.

    • 실패율 순으로 정렬하여 스테이지의 번호를 반환한다.

  • 중요한 조건

    1. 실패율이 같을 경우 스테이지가 작은 번호가 우선

    2. 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0

Review

  • 해당 문제는 빠른 시일 내로 다시 풀어보자.

Comments

Index