오늘은 프로그래머스 실패율 문제를 풀어보았다. 오늘은 서론 없이 진행하겠다.
실패율 문제의 링크는 아래와 같다.
https://programmers.co.kr/learn/courses/30/lessons/42889
이 문제는 한 세번정도 시도 했던 것 같다. 첫 번째 시도는 1단계 문제들을 풀 기로 했던 올해 초였는데, 그 때 문제를 처음 봤었다. 그 때 한번 보고, 너무 어렵겠다 싶어서 다른 문제를 풀려고 넘어갔었다. 두 번째 시도는 최근에 다시 문제를 풀려고 시도했었는데 어떻게 진행할지 머리속에서 뚜렷하게 나오지 않아서 어떻게 할까.. 하다가 몇일이 지났었다. 그리고 드디어 오늘인 세 번째 시도에서 성공했다!!!!
그런데 생각보다 그렇게 어렵지는 않아서 풀고나서 허탈함이 많이 들었다. 다음은 내가 푼 풀이방법을 글로 설명한 것이다.
1. stages[] 배열에 현재 멈춰있는 스테이지의 원소들이 들어있으므로, 단계의 개수만큼의 array를 만들어서 해당 array의 인덱스 값을 스테이지로 지정한다. 스테이지로 지정한 인덱스 값이 들어올 경우마다 저장된 값을 1씩 저장하여 결과적으로 array에는 해당 단계에 얼마만큼 정체되어있는지 저장한다.
2. stages[]의 길이가 전체 사람의 수 이므로 stages.length()를 분모로 하고 array의 인덱스 내부의 값을 분자로 해서 실패율을 계산한다.
3. 계산한 값을 내림차순으로 정렬해야하기 때문에(실패율에 따라 내림차순으로 정렬해야하지만, 반환해야하는 값은 단계이다.) Stage라는 클래스를 정의하여 비교할때는 실패율에 따라 비교할 수 있게 compareTo() 메소드를 재정의했다.
4. stream()을 이용하여 list를 array로 바꿔줬다.
아래는 위의 풀이방식대로 푼 코드이다.
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int cnt = stages.length;
int[] arr = new int[N+1];
for(int i: stages){
arr[i-1]++;
}
ArrayList<Stage> list = new ArrayList<>();
for(int i=0; i<arr.length-1; i++){
if(arr[i]== 0)
list.add(new Stage(i+1,(double) 0));
else
list.add(new Stage(i+1,(double) arr[i]/cnt));
cnt -= arr[i];
}
return list.stream().sorted().mapToInt(Stage -> Stage.num).toArray();
}
class Stage implements Comparable<Stage>{
int num;
double fail_percent;
Stage(int num, double fail_percent){
this.num = num;
this.fail_percent = fail_percent;
}
@Override
public int compareTo(Stage o){
if(this.fail_percent > o.fail_percent)
return -1;
else if(this.fail_percent == o.fail_percent)
return 0;
else
return 1;
}
}
}
위의 코드를 작성하면서 막혔던 곳이 세개가 있다.
첫번째는 Stage라는 객체에 저장을 해서 비교하려고 했는데 List의 comparable을 재정의 할 지, Stage 객체의 comparable을 재정의 할지 고민이 됐다. 나는 Stage 객체의 comparable을 재정의했는 데, 이게 더 쉬운 것 같다.
두번째는 stream을 이용하는 과정에서 stream().sorted().map().toArray() 를 이용해서 list -> array로 변경하는데, 계속 int 배열이 아닌 object 배열이 반환되었다. 이 문제는 stream().sorted().mapToInt().toArray()로 해결했다.
세번째는 채점과정에서 테스트케이스 2개정도가 실패로 떴고, 하나는 런타임에러가 발생했다. 그런데 아무리봐도 이 코드에서 변경해야할 부분이 보이지 않아서 헤맸다. 그러다 질문하기에 게시되어있는 한 게시글에서 "만약에 한 단계에 머물러있는 사람이 없다면 바로 0을 반환하게 하면 된다." 라는 내용이 있어 그 부분을 고려하여 코드 일부분을 수정했더니 모든 테스트케이스를 성공할 수 있었다. 아마도 단계에 머물러있는 사람이 없을 때는 무조건 0이 나와야 하는데, 실패율을 계산하는 과정에서 문제가 생겼었나보다.
백준 1188번. 음식 평론가 (0) | 2022.05.26 |
---|---|
알고리즘 작은 팁 (0) | 2022.05.13 |
소수 알고리즘 (0) | 2022.05.03 |
[프로그래머스] 점프와 순간 이동 (0) | 2022.04.29 |
[프로그래머스] 신고 결과 받기 (0) | 2022.04.12 |
댓글 영역