다희의 코딩 성장일기

[프로그래머스] level1. 실패율 (자바 JAVA) 본문

Algorithm/프로그래머스

[프로그래머스] level1. 실패율 (자바 JAVA)

ilmiodiario 2021. 8. 24. 13:46

[ 문제 ]  [프로그래머스] level1. 실패율 (자바 JAVA)

 

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr


# 접근 방법 및 풀이 

 

  • 오 생각보다 바로 안 풀려서 놀랐던 문제..ㅎ..왜때문에 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이어도 카카오 기출은 다르다.

좋은문제... ㅠㅠ 테케가 많이 주어지지 않았다면 어디서 틀렸는지도 몰랐을 것이다.

문제 정확히 읽고 풀어라 제발..

Comments