https://school.programmers.co.kr/learn/courses/30/lessons/42889
문제 접근
Map에다가 해당 스테이지 번호 키에 실패율을 담아서 사용하였다.
Map에는 keySet()으로 Map이 가지고 있는 key들을 출력 가능한 메소드가 있는데 해당 메소드로 실패율이 제일 높은 스테이지를 검사해서 해당 스테이지를 배열에 담고 return
문제를 풀다가 해당 스테이지 아무도 가지 못했을 때 실패율이 0 / 0이 나오는 경우가 있는데 내 지식선에선 이게 그냥 0으로만 생각되는데 자바에선 이런 계산식은 NaN으로 인식한단다.
그래서 찾아보니 다른 사람은 0 / 0 계산이 나올 경우 변수를 1로 만들어서 0 / 1 계산식이 나오게 만들어 줬더라
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
Map<Integer, Double> failRate = new HashMap<>(); // 스테이지 번호와 실패율을 담을 Map
for(int i=1; i<=N; i++) { // 스테이지
double clearPlayer = 0;
double stayPlayer = 0;
for(int j=0; j<stages.length; j++) { // 각 배열돌며 숫자 확인
if(stages[j] > i) clearPlayer++;
if(stages[j] == i) stayPlayer++;
}
if(stayPlayer == 0 && clearPlayer == 0) clearPlayer = 1; // 자바에선 0 / 0을 하면 NaN이 뜬단다.
// 해당 스테이지 도착한 인원이 아무도 없을 땐 0 / 0을 방지하기위해 clearPlayer를 1로 만들어줌
failRate.put(i, stayPlayer / (stayPlayer + clearPlayer)); // 스테이지에 실패율 담기
}
for(int i=0; i<N; i++) {
double maxNum = -1; // 제일 큰 실패율
int stage = 0;
for(int k : failRate.keySet()) { // 모든 실패율 비교
if(failRate.get(k) > maxNum) { // 순서대로 실패율을 비교하기에 같은 값이 있더라도 먼저 온 값을 저장하게 된다
maxNum = failRate.get(k); // 바뀌지 않으면 현재 stage가 가장 큰 실패율을 가짐
stage = k;
}
}
answer[i] = stage; // 최고 실패율을 가진 스테이지 차례대로 저장
failRate.remove(stage); // 현재 스테이지 삭제하고 남은 스테이지끼리 비교
}
return answer;
}
}
다른 사람 풀이
처음에 떠올렸던 실패율에 상응하는 새로운 배열을 만들어서 실패율의 크기에 따라 같이 위치가 바뀌는 배열로 문제를 풀고 싶었는데 풀다가 헷갈려서 Map으로 노선을 바꿨었다.
이 분은 내가 풀고싶어했던 방식으로 푸셨다.
많이 풀면 이런 사고가 자연스레 생길까?
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; // 전체 참가 인원
double tempD = 0;
int tempI = 0;
for (int i = 0; i < arrLength; i++) { // 해당 스테이지에 몇 명있는지 찾는 for문인 듯
int stage = stages[i];
if (stage != N + 1)
answer[stage - 1] += 1; // 2stage면 answer 배열에선 1번 째 자리
}
for (int i = 0; i < N; i++) {
int personNum = answer[i];
tempArr[i] = (double) personNum / idx; // 실패율
idx -= personNum; // 첫 스테이지 실패율 구한 후 다음 스테이지부턴 이전 스테이지 실패자 수는 빼고 계산
answer[i] = i + 1; // N이 5면, 1 2 3 4 5 차례대로 저장
}
for (int i = 0; i < N; i++) {
for (int j = 1; j < N - i; j++) {
if (tempArr[j - 1] < tempArr[j]) { // 0번 째 요소에 제일 큰 값을 옮기는 연산
tempD = tempArr[j - 1];
tempArr[j - 1] = tempArr[j];
tempArr[j] = tempD;
tempI = answer[j - 1]; // 해당 조건문이 실행되면 answer 배열도 상응하는 스테이지 번호가 바뀜
answer[j - 1] = answer[j];
answer[j] = tempI;
}
}
}
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / 완주하지 못한 선수 / JAVA / 해시] (1) | 2023.03.17 |
---|---|
[프로그래머스 / 체육복 / JAVA / 탐욕법] (1) | 2023.03.16 |
[프로그래머스 / 크레인 인형뽑기 게임 /JAVA] (0) | 2023.03.12 |
[프로그래머스 / K번 째 수 / JAVA / 정렬] * Arrays.copyOfRange() (0) | 2023.03.10 |
[프로그래머스 / 모의고사 / JAVA / 완전탐색] (1) | 2023.03.10 |
댓글