알고리즘 풀이 방법입니다.
문제(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이다.
- [4,1,2,3]
생각 안했을떄의 결과 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] 일때도 생각을해서 , 문제를 푸는것이 중요!
'Algorithm' 카테고리의 다른 글
[프로그래머스] 없는 숫자 더하기 (0) | 2022.08.08 |
---|---|
[프로그래머스] 내적 (0) | 2022.08.08 |
[프로그래머스] K번째수 (0) | 2022.08.02 |
[프로그래머스] 3진법 뒤집기 (0) | 2022.07.29 |
[프로그래머스] 두 개 뽑아서 더하기 (0) | 2022.07.28 |