# 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42889
목차
카카오 문제 해설 2019 카카오 신입 공채 1차 코딩 테스트 문제 해설 링크
더보기
먼저 주어진 배열의 길이를 이용하여 전체 사용자 수를 구하고,
stages 를 순회하며 각 스테이지에 몇 명의 사용자가 도달했는지 세줍니다.
이렇게 만들어둔 배열(각 스테이지별 사용자 수가 들어있는)을 순회하면서 stages 를 참고하여 스테이지별 실패율을 계산합니다.
이때, 스테이지에 도달한 사용자가 0명인 경우 예외 처리를 해야 합니다.
스테이지별 실패율을 구했다면, 각 스테이지 번호와 묶어서 실패율 내림차순으로 정렬합니다.
실패율이 같은 경우는 스테이지 번호가 작은 것을 먼저 오도록 정렬하면 됩니다.
프로그래머스 다른사람 풀이 참고 1 (오진영 , 종헌 , iseguswns@gmail.com , zeroempty2 외 2 명 / 링크)
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
double[] tempArr = new double[N];
int arrLength = stages.length;
int idx = arrLength; // 전체 플레이어 수 => 1번째 스테이지에 도달한 플레이어 수
// 1. 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 초기화
for (int stage : stages) {
if (stage != N + 1)
answer[stage - 1] += 1;
}
// 2.
for (int i = 0; i < N; i++) {
int personNum = answer[i]; // 현재(i번째) 스테이지에 도달했지만 아직 클리하지 못한 플레이어의 수
tempArr[i] = (double) personNum / idx; // 실패율 계산
idx -= personNum; // "다음(i+1번째) 스테이지에 도달한 플레이어 수"를 구하기 위해 "현재(i번째) 스테이지에 도달했지만 아직 클리하지 못한 플레이어의 수"만큼 빼준다.
answer[i] = i + 1; // 스테이지 번호(인덱스) 초기화
}
// 3. 실패율 배열(tempArr[])과 스테이지 번호(인덱스) 배열(answer[]) 정렬 - 실패율 배열의 값으로 내림차수
double tempD = 0;
int tempI = 0;
for (int i = 0; i < N; i++) {
for (int j = 1; j < N - i; j++) {
if (tempArr[j - 1] < tempArr[j]) {
tempD = tempArr[j - 1];
tempArr[j - 1] = tempArr[j];
tempArr[j] = tempD;
tempI = answer[j - 1];
answer[j - 1] = answer[j];
answer[j] = tempI;
}
}
}
return answer;
}
}
다른사람 풀이 보고 사알짝 수정하고 주석 달아보았다~~
프로그래머스 다른사람 풀이 참고 2 (Collections.sort) (허현 / 링크)
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 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 {
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;
}
}
}
Comparable인터페이스를 구현하는 class를 정의하고
Comparable인터페이스의 compareTo 메서드를 정의해서 sorting에 활용
방식 잘 봐두자!!!
참고하기: https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html
'알고리즘 문제풀이 > 프로그래머스 Level 1' 카테고리의 다른 글
[2018 KAKAO BLIND RECRUITMENT[1차]/Java] 비밀지도 (0) | 2023.07.23 |
---|---|
[2020 카카오 인턴십/Java] 키패드 누르기 (0) | 2023.07.21 |
[2021 KAKAO BLIND RECRUITMENT/Java] 신규 아이디 추천 (0) | 2023.07.20 |
[2021 카카오 채용연계형 인턴십/Java] 숫자 문자열과 영단어 (0) | 2023.07.20 |
[2022 KAKAO BLIND RECRUITMENT/Java] 신고 결과 받기 (0) | 2023.07.17 |