다희의 코딩 성장일기
[프로그래머스] level1. 실패율 (자바 JAVA) 본문
[ 문제 ] [프로그래머스] level1. 실패율 (자바 JAVA)
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42889
# 접근 방법 및 풀이
- 오 생각보다 바로 안 풀려서 놀랐던 문제..ㅎ..왜때문에 level1이신건지..?
- 정렬과 구현을 이용해서 풀었다.
- Point class에 int x, double y 변수를 두었다. x는 stage, y는 실패율이다.
- 해당 클래스의 정렬 구현시, y 실패율을 내림차순으로 해야하는데 Comparable의 오버라이드 메소드인 compareTo는 return type이 int이기 때문에 Double.compare(o.y, this.y);로 구현해야한다. 이 부분이 바로 생각 안나서 인터넷 찾았다..
- 가장 먼저, 입력으로 들어온 stages[] 배열을 오름차순으로 정렬해주었다.
-
0 1 2 3 4 5 6 7 1 2 2 2 3 3 4 6 - 정렬하는 이유는 stage 1단계부터 ~N 단계까지 차례대로 도달한 stage를 세어줄 수 있기 때문이다. 도
- 첫번째 for문으로 i =1부터 N까지의 단계를 돌며, 두번째 for문은 idx부터 stages.length까지 돌며 해당 i가 몇개 있는지 cnt를 세어준다.
- 이때 두번째 for문이 idx부터 인 경우는 해당 stage를 세어줄때마다 0번째 부터 돌 필요가 없기 때문이다.
- 이미 오름차순으로 stages배열을 정렬해두었기 때문에 i-1번째 스테이지의 실패율은 계산했기때문이다.
- ex) idx = 4인 경우 이미 0~3까지인 stage 1과 2는 실패율이 계산되어 있음.
- 실패율 계산은 먼저 size라는 변수를 두어 stages.length로 초기화 해주고, 해당 스테이지의 cnt를 센 후, 실패율 = cnt / size를 해주면 된다. 그리고 size에 해당 cnt를 빼준다.
- 왜냐하면 1단계를 시도한 사람은 그 이후인 2~N단계는 도달하지 못했기 때문이다. 1단계에 도착한 cnt를 전체 size에서 빼주어야한다.
- 실패율 계산에서 중요한건 cnt를 셀때 cnt가 0 일경우 실패율 계산을 하지 않고 0을 넣고 넘어간다.
- 이유는 cnt = 0이고, size = 0일때, 0/0은 에러가 나기 때문이다..^^
- 만약 테케 1, 6 등등등 많이 에러가 난다면 이부분 때문이니 참고하길!
- 나머지 자세한건 코드참조
# 주의할 점
- 스테이지에 도달한 유저가 없을 경우 실패율은 0. 이부분 때문에 많이들 틀리는 것 같다.
- 평균 구할때 소수점까지 계산해야하므로 double로 해야함. int로 했다가 정렬 안되서 띠용..?
JAVA 코드
import java.util.*;
class Solution {
static class Point implements Comparable<Point> {
int x;
double y;
public Point(int x, double y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Point o) {
if (o.y == this.y) {
return this.x - o.x;
}
return Double.compare(o.y, this.y);
}
}
public int[] solution(int N, int[] stages) {
List<Point> list = new ArrayList<>();
Arrays.sort(stages);
int size = stages.length;
int idx = 0;
for (int i = 1; i <= N; i++) {
int cnt = 0;
for (int j = idx; j < stages.length; j++) {
if (stages[j] > i) {
break;
}
cnt++;
idx++;
}
if(cnt == 0){
list.add(new Point(i, 0));
continue;
}
list.add(new Point(i, (double)cnt / size));
size -= cnt;
}
Collections.sort(list);
int[] answer = new int[N];
for (int i = 0; i < N; i++) {
answer[i] = list.get(i).x;
}
return answer;
}
}
REVIEW
이게 왜 level 1일까! 같은 레벨1이어도 카카오 기출은 다르다.
좋은문제... ㅠㅠ 테케가 많이 주어지지 않았다면 어디서 틀렸는지도 몰랐을 것이다.
문제 정확히 읽고 풀어라 제발..
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] level2. N개의 최소공배수 (자바 JAVA) (0) | 2021.08.24 |
---|---|
[프로그래머스] level2. 행렬의 곱셈 (자바 JAVA) (0) | 2021.08.24 |
[프로그래머스] level1. 약수의 개수와 덧셈 (자바 JAVA) (0) | 2021.08.23 |
[프로그래머스] level1. 음양 더하기 (자바 JAVA) (0) | 2021.08.23 |
[프로그래머스] level1. 폰켓몬 (자바 JAVA) (0) | 2021.08.23 |
Comments