우보천리 개발

[프로그래머스] 42889 카카오 기출 - 실패율 Java 본문

알고리즘/프로그래머스

[프로그래머스] 42889 카카오 기출 - 실패율 Java

밥은답 2023. 2. 1. 23:54
반응형

42889 프로그래머스 카카오 기출 실패율

https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

아이디어

  • 실패율을 구하는 공식은 스테이지 클리어 못한 플레이어 수 / 스테이지 도달한 플레이어 수
  • 그렇기 때문에 클리어를 못한 사람과, 도달한 플레이어를 카운팅 해주어야한다
  • 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호를 출력해야 되기 때문에
  • 스테이지 번호와 해당 스테이지의 실패율을 저장할 클래스를 만든다
  • 더 자세한건 코드 내 주석을 통해 설명

코드

// 프로그래머스에 직접 입력한 코드이기에 따로 실행하면 안됨

import java.util.*;
class Node implements Comparable<Node> {
    int stage; // 스테이지번호
    double fail_rate; // 실패율
    public Node(int stage, double fail_rate) {
        this.stage = stage;
        this.fail_rate = fail_rate;
    }
    @Override
    // 실패율을 내림차순으로 정렬
    public int compareTo(Node other) {
        return Double.compare(other.fail_rate, this.fail_rate);
    }
}

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        ArrayList<Node> al = new ArrayList<>();
        
        // 스테이지 번호 1~N까지의 스테이지에 대해서
        for (int i=1; i<=N; i++) {
            int reached = 0; // 해당 스테이지를 도달한 사람
            int failed = 0; // 스테이지를 도달했지만 클리어 못한 사람
            // 주어진 배열을 탐색하는데
            for (int j=0; j<stages.length; j++) {
                if (stages[j] == i) { // 현재 스테이지와 플레이어가 도전중인 스테이지가 같으면
                    failed++; // 실패인원 ++
                    // 이유는 예를 들어 1번 스테이지, 현재 플레이어가 도전 중 스테이지가 1이면
                    // 아직 1을 도전중.. 2번, 3번 ... 스테이지는 도전 못했음
                }
                // 플레이어가 현재 스테이지와 같거나 크면 클리어했다
                if (stages[j] >= i) {
                    reached++;
                }
            }
            // reached가 0이라는 것은 실패율이 0
            // Node에 해당 스테이지와 실패율 0 저장
            if (reached == 0) {
                al.add(new Node(i, 0));
            }
            // 그렇지 않으면 해당 스테이지의 실패율을 공식에 따라 저장
            else {
                al.add(new Node(i, (double) failed / reached));
            }
        }
        Collections.sort(al);
        for (int i=0; i<al.size(); i++) {
            answer[i] = al.get(i).stage;
        }
        return answer;
    }
}
반응형
Comments