알고리즘 풀이 방법입니다. 문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄
https://school.programmers.co.kr/learn/courses/30/lessons/42889
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
Think🤔
import java.util.Arrays;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
float[] failper = new float[N]; // double까지 필요없어서 float 사용
int chall = stages.length;
int level = 1;
// 스테이지별 실패율 구하는 부분
while(chall > 0){
int fail = 0;
for(int i=0; i<stages.length; i++){
if(stages[i] == level){ // 못깬사람의 스테이지 하고 level 같으면 실패 더해줌
stages[i] = 0; // 실패한 사람 0으로
fail++;
}
}
if(fail == 0) { // 만약 실패 0이면 하나 남거나 나머지 다 성공했으므로 break
break;
}
failper[level-1] = (float)fail / (float)chall;
chall = chall - fail; // 분모의 수는 실패한 개수를 빼야하므로 넣어줌
level++; // 레벨은 0~ 차근차근 올라가므로 마지막에 ++
}
// 실패율이 높은 레벨부터 내림차순
for(int i=0; i<N; i++) {
float max = -1; // max를 0으로 수정하면 값에 0이 있을경우 그 값과 비교 불가능
int deleteNum = 0;
for(int j=0; j<N; j++) {
if(failper[j] > max) {
max = failper[j];
deleteNum = j;
}
}
answer[i] = deleteNum + 1;
failper[deleteNum] = -1; // 이미 최고 실패율이면 -1로 바꿔주고 max값에 못들어가게
}
return answer;
}
}
2번째 조건,
모든 사용자가 마지막 스테이지에 있으므로 4번 스테이지의 실패율은 1이며 나머지 스테이지의 실패율은 0이다.
생각 안했을떄의 결과 63점 .. 중간에 코드를 수정한다고 해도 런타임 에러가 발생했으므로 코드 수정 필요
while문으로 length를 줄이는 부분에서 if(fail == 0) 부분도 가독성이 좋지 않고, 로직상 문제가 있어 런타임에러가 나기 때문에 리팩토링 필요
Solution✍
package kcue.test;
import java.util.Arrays;
public class failRate {
public static void main(String[] args) {
// 5 [2,1,2,6,2,4,3,3] [3,4,2,1,5]
// 4 [4,4,4,4,4] [4,1,2,3]
// 3 [1,1,1] [0,0,0]
// 5 [3,3,3,3] [3,1,2,4,5]
int N = 3;
int[] stages = {1,1,1};
/////////////////////////////////////////////////////////
int[] answer = new int[N];
int chall = stages.length;
int level = 1;
float[] failper = new float[N];
for(int j=0; j<N; j++) {
int fail = 0;
for(int i=0; i<stages.length; i++){
if(stages[i] == level){
stages[i] = 0; // 실패한 사람 0으로
fail++;
}
}
if(chall == 0) {
break;
}
failper[level-1] = (float)fail / (float)chall;
chall = chall - fail;
level++;
System.out.println("chall : " + chall + " , fail : " + fail + " , failper[] " + Arrays.toString(failper));
}
// 실패율이 높은 레벨부터 내림차순
for(int i=0; i<N; i++) {
float max = -1;
int deleteNum = 0;
for(int j=0; j<N; j++) {
if(failper[j] > max) {
max = failper[j];
deleteNum = j;
}
}
answer[i] = deleteNum + 1;
failper[deleteNum] = -1;
System.out.println(Arrays.toString(failper));
}
}
}
반복문으로 바꾼후, chall의 length가 0이 되면 반복문을 멈추게 해준다.
안그러면 0으로 나눠서 NaN값을 배열에 담게 되므로 오류가 발생할 수 있음..
Review🤩
// 5 [3,3,3,3] [3,1,2,4,5] 일때도 생각을해서 , 문제를 푸는것이 중요!