🔗 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42889


👨🏻‍💻 내가 작성한 코드

import java.util.*;
class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        
        List<Stage> stageList = new ArrayList<>();
        Stage tempStage = new Stage(0);
        for (int i=1; i<=N; i++) {
            stageList.add(new Stage(i));
        }
        
        // Stages의 정보들 반영
        for(int user: stages){
            if (user == N+1) { // 모든 stage를 통과한 경우
                for (int i=0; i<user-1; i++){
                    stageList.get(i).pass++;
                }
            }
            else { // 중간에서 막힌 경우
                for (int i=0; i<user; i++){
                    tempStage = stageList.get(i);
                    if (i==user-1){
                        stageList.get(i).current++;
                        stageList.get(i).pass++;
                    }
                    else {
                        stageList.get(i).pass++;
                    }
                }
            }
        }
        
        // failPercent계산
        for (int i=0; i< N; i++) {
            if (stageList.get(i).pass == 0){
                stageList.get(i).failPercent = 0;
            }
            else {
                stageList.get(i).failPercent = ((float)stageList.get(i).current / stageList.get(i).pass);
            }
        }
        
        // 내림차순으로 정렬
        stageList.sort(Comparator.naturalOrder());
        
        // answer에 stage값들 추가
        for (int i=0; i< N; i++)
        	answer[i] = stageList.get(i).stageNum;
            
        return answer;
    }
}

class Stage implements Comparable<Stage>{
    int stageNum;
    int pass = 0;   // Stage를 통과한 사람 수+ Stage에 있는 사람 수
    int current = 0;   // 현재 Stage에 있는 사람 수
    float failPercent = 0;
    
    public Stage(int stageNum){
        this.stageNum = stageNum;
    }

	@Override
	public int compareTo(Stage o) {
		// TODO Auto-generated method stub
		if (failPercent == o.failPercent)
    		return 0;
    	else if (failPercent < o.failPercent)
    		return 1;
    	else
    		return -1;
	}
}


📝 결론

문제를 계속 풀다보니 문제 풀이법을 접근하는게 발전하고 있는것 같다. 하지만 여전히 코드 구현을 할 때는 막히는 부분이 있어서 검색을 하게 되는 것 같다.

이번 문제에서는 List에서 Object의 정렬을 할 때 compareTo 메서드를 override하는 부분에서 막히게 되었었다. compareTo 재정의를 이번 기회에 외워가고자 한다.

List의 정렬은 아래의 compareTo 메서드를 재정의하였으면 아래의 코드를 통해 정렬할 수 있다.

list.sort(Comparator.naturalOrder());
or
list.sort(Comparator.reverseOrder());

📌return 1이면 정렬을 할 때 더 뒤로 간다!!!

class Stage implements Comparable<Stage>
  ....
  @Override
	public int compareTo(Stage o) {
		// TODO Auto-generated method stub
		if (failPercent == o.failPercent)
    		return 0;
    	else if (failPercent < o.failPercent)
    		return 1;
    	else
    		return -1;
	}
profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글