[Programmers / Level1] 실패율(Java)

이하얀·2024년 4월 12일
0

💡 Info



입출력 조건

image



입출력 예시



문제 이해

  • 전체 스테이지 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스케이지부터 내림차순으로 스테이지의 번호가 담겨 있는 배열을 return 하도록 solution 함수 완성하기


💭 생각한 알고리즘

실제 풀이 시간 : 23분
0. Comparable로 Game 클래스 - stage, fail 변수 작성하기
1. 배열 선언 및 스테이지 변수 선언하기
2. 실패율 계산하기
스테이지 도달했으나 클리어 못한 플레이어 수 / 스테이지 도달한 플레이어 수
3. 스테이지 return : 실패율이 높은 사용자부터 내림차순 정렬

import java.util.*;

class Game implements Comparable<Game> {

   private int stage;
   private int fail;

   public Game(int stage, int fail) {
      this.stage = stage;
      this.fail = fail;
   }

   public int getStage() {
      return this.stage;
   }

   @Override
   public int compareTo(Game other) {
      if (this.fail == other.fail) {
         return Integer.compare(this.stage, other.stage);
      }
      return Integer.compare(other.fail, this.fail);
   }
}


class Solution {
   public int[] solution(int N, int[] stages) {

      int[] answer = new int[N];
      ArrayList<Game> Game = new ArrayList<>();

      int player = 0;

      for(int i=0; i<N; i++){
         int fail = player / stages.length;
         Game.add(new Game(i, fail));
      }

      Collections.sort(Game);

      for(int i=0; i<N; i++){
         answer[i] = Game.get(i).getStage();
      }
      return answer;
   }
}


❌ 오답체크

  • player에 대한 구조를 작성하지 않아, 제대로 된 실패율 계산에 실패
    • fail을 Double로 선언해서 정확하게 계산해야 함.
    • 스테이지 개수를 0 ~ N -> 1 ~ N+1(<=N)으로 변경!
//before
int player = 0;
for(int i=0; i<N; i++){
    int fail = player / stages.length;
    Game.add(new Game(i, fail));
}

//after
for(int i=1; i<=N; i++){
    int player = 0;
    for(int j=0; j<stages.length; j++){
        if(stages[j] == i){
            player++;
        }
    }

    double fail = 0;
    if(stages.length >= 1){
        fail = (double) player / stages.length;
    }
    GameList.add(new Game(i, fail));
    stages.length -= player;
}
  • stages.length -= player에서 오류 발생
    • stages.length가 final로 선언되어 있어 배열이 변경되지 않기 때문에 발생!
    • stages.length를 별도 변수로 선언해서 해결
    • 이때, stages.length는 변하면 안되는 변수이기 때문에 int stageLength = stages.length;를 반복문 내부에 선언하면 각 반복마다 배열의 길이가 변경되는 문제로 인해 테스트가 모두 통과하지 못함.
...
        int stageLength = stages.length;
        
       ...
            
            //실패율 계산하기
            double fail = 0;
            
            //int stageLength = stages.length;
            
            if(stageLength >= 1){
                fail = (double) player / stageLength;
            }
            GameList.add(new Game(i, fail));
            stageLength -= player;
        }
        
        Collections.sort(GameList);
        
        for(int i=0; i<N; i++){
            answer[i] = GameList.get(i).getStage();  
        }
        return answer;
    }
}


💭 최종 풀이

  1. Comparable로 Game 클래스 - stage, fail 변수 작성하기
  2. 배열 선언 및 스테이지 변수 선언하기
    • 스테이지 개수 역시 선언 -> 이 때, 반복문의 바깥에 선언해줘야 함!!!
  3. 스테이지에 있는 사람 수 계산하기
  4. 실패율 계산하기
    스테이지 도달했으나 클리어 못한 플레이어 수 / 스테이지 도달한 플레이어 수
  5. 스테이지 return : 실패율이 높은 사용자부터 내림차순 정렬
import java.util.*;

class Game implements Comparable<Game> {

    private int stage;
    private double fail;

    public Game(int stage, double fail) {
        this.stage = stage;
        this.fail = fail;
    }

    public int getStage() {
        return this.stage;
    }

    @Override
    public int compareTo(Game other) {
        if (this.fail == other.fail) {
            return Integer.compare(this.stage, other.stage);
        }
        return Double.compare(other.fail, this.fail);
    }
}


class Solution {
    public int[] solution(int N, int[] stages) {

        int[] answer = new int[N];
        ArrayList<Game> GameList = new ArrayList<>();
        int stageLength = stages.length;

        for(int i=1; i<=N; i++){
            int player = 0; //스테이지 안의 플레이어 수
            for(int j=0; j<stages.length; j++){
                if(stages[j] == i){ //스테이지가 계속되는 동안
                    player++;
                }
            }

            //실패율 계산하기
            double fail = 0;

            if(stageLength >= 1){
                fail = (double) player / stageLength;
            }
            GameList.add(new Game(i, fail));
            stageLength -= player;
        }

        Collections.sort(GameList);

        for(int i=0; i<N; i++){
            answer[i] = GameList.get(i).getStage();
        }
        return answer;
    }
}

profile
언젠가 내 코드로 세상에 기여할 수 있도록, BE 개발 기록 노트☘️

0개의 댓글