TIL 2023-01-30 항해99 D+22

황원준·2023년 1월 30일

hanghae99

목록 보기
20/24

1. 문제점

2. 시도 해본 것들

알고리즘 주차 페어프로그래밍을 진행 하고 있었다.챌린지 문제 중 하나였는데 같이 조원과 같이 풀게 됐는데 어려웠다. 일단, 내가 문제 이해를 못하고 있었다. 요즘 많이 코딩테스트 문제를 풀면서 이제는 보면 어떤 개념을 써야하는지 보이는데 도대체 떠오르지가 않았다. 그래서 조원의 도움을 받으면서 문제를 따라가면서 풀게 되었는데, 문제에 "실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록" 이라는 부분에서 막히기 시작했다.

3. 해결법

import java.util.*;

class FailInfo implements Comparable<FailInfo> {
    int stage;
    double fail;

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


    @Override // 실패율이 높은 스테이지부터 내림차순으로 하는 정렬시키는 메서드
    public int compareTo(FailInfo o) {
        if (this.fail == o.fail)
            return this.stage - o.stage;
        if (this.fail < o.fail) return 1;
        else return -1;
    }
}

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        FailInfo[] failInfos = new FailInfo[N]; // 객체 선언

//        double[] fail = new double[N];

        // 1 ~ N 단계까지 실패율을 fail[idx]에 담는다.
        // fail[idx]에서 Idx는 단계다.
        // fail[0] 에는 1단계의 실패율, FAil[1]에는 2단계 실패율, .. fail[n-1]에는 n단계 실패율
        // 1단계의 실패율은 (1단계 trying) / (1단계 이상 TryOrPass)

        for (int idx = 1; idx <= N; idx++) {
            int trying = 0;
            int tryOrPass = 0;
            for (int i = 0; i < stages.length; i++) {
                if (stages[i] == idx) {
                    trying++;
                }

                if(stages[i] >= idx) {
                    tryOrPass++;
                }
            }

            // tryOrPass 가 0 이면 실패율은 0.0
            if (tryOrPass == 0)
                failInfos[idx-1] = new FailInfo(idx, 0.0);
            else
                failInfos[idx-1] = new FailInfo(idx, (double)trying / tryOrPass);

//            fail[idx-1] = (double)trying / tryOrPass;
        }

//        List<Double> list = new ArrayList<>();
//        for (double d : fail) {
//            list.add(d);
//        }
//
//        // sort -> 역방향으로 내림차순
//        Collections.sort(list, Collections.reverseOrder());
//        System.out.println(list);

        Arrays.sort(failInfos); // 실패율이 높은 스테이지부터 내림차순으로 하는 정렬 메서드 호출
        int index = 0;
        for (FailInfo f : failInfos) {
            answer[index++] = f.stage;
        }

        return answer;
    }
}

위 처럼 실패율을 클래스로 만들어 객체를 생성해 comparable이라는 interface를 구현시켜 실패율이 높은 스테이지부터 내림차순으로 정렬조건으로 하는 메서드를 생성시켜서 구현했다.

4. 알게 된 점

  1. Comparator와 Comparable
    : 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있으며, Comparable을 구현하고 있는 클래스들은 같은 타입의 인스턴스까지 서로 비교할 수 있는 클래스들이 있다.
    : Comparable - java.lang 패키지, 기본 정렬기준을 구현하는데 사용
    : Comparator - java.util 패키지, 기본 정렬기준 외 다른 기준으로 정렬하고자 할 때 사용

  2. Arrays.sort()는 배열을 정렬할때, Comparator를 지정해주지 않으면 저장하는 객체(Comparable을 구현한 클래스의 객체)에 구현된 내용에 따라 정렬된다.

  3. 주어진 문제에 대한 이해력 높여야 겠다.

profile
좋은 개발자가 되기 위해 노력 하는 개린이

0개의 댓글