프로그래머스 실패율 JAVA 풀이 (정렬, 구현)

2026. 6. 17. 21:04·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📌 문제 개요

게임의 각 스테이지마다 실패율을 계산한 뒤 실패율이 높은 순서대로 스테이지 번호를 정렬하는 문제이다.

실패율은 다음과 같이 정의된다.

실패율 = 현재 스테이지에 도달했지만 아직 클리어하지 못한 사용자 수 / 현재 스테이지에 도달한 사용자 수
실패율이 같다면 스테이지 번호가 작은 순으로 정렬해야 한다.


📌 접근 방법

각 스테이지에 머물러 있는 사용자 수를 카운팅 배열에 저장한다.

그 후 전체 사용자 수를 기준으로 각 스테이지의 실패율을 계산한다.

 

현재 스테이지에서 실패한 사용자 수를 전체 도달 인원에서 제외하면서 다음 스테이지의 도달 인원을 구할 수 있다.

계산한 실패율과 스테이지 번호를 객체에 저장한 뒤 정렬하여 결과를 반환한다.


📌 핵심 아이디어

1. 각 스테이지 사용자 수 카운팅

int[] count = new int[N + 2];

for (int stage : stages) {
    count[stage]++;
}

예시

stages = [2,1,2,6,2,4,3,3]

count[1] = 1
count[2] = 3
count[3] = 2
count[4] = 1
count[5] = 0
count[6] = 1
 

2. 실패율 계산

int players = stages.length;

for (int i = 1; i <= N; i++) {
    double rate = 0;

    if (players != 0) {
        rate = (double) count[i] / players;
    }

    players -= count[i];
}

예시

1번 스테이지
실패 인원 : 1
도달 인원 : 8
실패율 : 1 / 8

players = 8 - 1 = 7

2번 스테이지
실패 인원 : 3
도달 인원 : 7
실패율 : 3 / 7

players = 7 - 3 = 4
 

3. 정렬 조건 설정

list.sort((a, b) -> {
    if (a.rate == b.rate) {
        return a.number - b.number;
    }
    return Double.compare(b.rate, a.rate);
});

정렬 기준

  1. 실패율 내림차순
  2. 실패율이 같으면 스테이지 번호 오름차순

📌 전체 코드

import java.util.*;

class Solution {

    static class Stage {
        int number;
        double rate;

        Stage(int number, double rate) {
            this.number = number;
            this.rate = rate;
        }
    }

    public int[] solution(int N, int[] stages) {

        int[] count = new int[N + 2];

        for (int stage : stages) {
            count[stage]++;
        }

        List<Stage> list = new ArrayList<>();

        int players = stages.length;

        for (int i = 1; i <= N; i++) {

            double rate = 0;

            if (players != 0) {
                rate = (double) count[i] / players;
            }

            list.add(new Stage(i, rate));

            players -= count[i];
        }

        list.sort((a, b) -> {
            if (a.rate == b.rate) {
                return a.number - b.number;
            }
            return Double.compare(b.rate, a.rate);
        });

        int[] answer = new int[N];

        for (int i = 0; i < N; i++) {
            answer[i] = list.get(i).number;
        }

        return answer;
    }
}

📄 정리

  • 실패율은 현재 스테이지 실패 인원 / 해당 스테이지 도달 인원으로 계산한다.
  • 카운팅 배열을 이용하면 각 스테이지 인원을 빠르게 구할 수 있다.
  • 현재 스테이지 계산 후 실패 인원을 제외하면서 다음 스테이지 도달 인원을 구한다.
  • 정렬 조건은 실패율 내림차순, 스테이지 번호 오름차순이다.
  • 구현과 정렬을 함께 활용하는 대표적인 문제이다.
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

프로그래머스 최댓값과 최솟값 JAVA 풀이 (문자열, 구현)  (0) 2026.06.18
프로그래머스 이웃한 칸 JAVA 풀이  (0) 2026.06.18
프로그래머스 덧칠하기 JAVA 풀이 (그리디)  (0) 2026.06.16
프로그래머스 소수 만들기 JAVA 풀이 (조합, 소수 판별)  (0) 2026.06.16
프로그래머스 폰켓몬 JAVA 풀이 (HashSet, 자료구조)  (0) 2026.06.15
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 프로그래머스 최댓값과 최솟값 JAVA 풀이 (문자열, 구현)
  • 프로그래머스 이웃한 칸 JAVA 풀이
  • 프로그래머스 덧칠하기 JAVA 풀이 (그리디)
  • 프로그래머스 소수 만들기 JAVA 풀이 (조합, 소수 판별)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN
      • 코테(Solved.ac + Programmers)
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    완전탐색
    실기
    문자열
    springboot
    정처기
    자료구조
    정보처리기사 실기 기출문제
    구현
    수학
    코딩테스트
    브루트포스
    알고리즘
    백준
    기출문제
    dp
    solved.ac
    정렬
    level1
    프로그래머스
    배열
    피보나치
    level0
    시뮬레이션
    정보처리기사
    백엔드개발자
    java
    자바
    정처기실기
    정처기오답노트
    Level2
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
프로그래머스 실패율 JAVA 풀이 (정렬, 구현)
상단으로

티스토리툴바