프로그래머스 lv1 실패율

namkun·2022년 7월 2일
0

코딩테스트

목록 보기
8/79
post-custom-banner

문제 링크

실패율

풀이

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.stream.Stream;

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

		HashMap<Integer, Integer> stageSurvivor = new HashMap<>();
		HashSet<FailRate> failRateSet = new HashSet<>();

		for (int i = 0; i < stages.length; i++) {
			if (stageSurvivor.containsKey(stages[i])) {
				stageSurvivor.put(stages[i], stageSurvivor.get(stages[i]) + 1);
			} else {
				stageSurvivor.put(stages[i], 1);
			}
		}

		int person = stages.length;
		for (int i = 1; i < N + 1; i++) {
			if (stageSurvivor.containsKey(i)) {
				double failRate = (double) stageSurvivor.get(i) / person;
				person -= stageSurvivor.get(i);
				failRateSet.add(new FailRate(i, failRate));
			} else {
				failRateSet.add(new FailRate(i, 0d));
			}
		}

//		처음에 사용했던 comparator 구현
// 		Comparator<FailRate> comparator = (o1, o2) -> {
// 			if (o1.failRate < o2.failRate) {
// 				return 1;
// 			} else if (o1.failRate == o2.failRate) {
// 				if(o1.stage > o2.stage) return 1;
// 				else return -1;
// 			} else {
// 				return -1;
// 			}
// 		};

// 		Stream<FailRate> sorted = failRateSet.stream().sorted(comparator);
// 		Integer[] answer = sorted.map(x -> x.stage).toArray(Integer[]::new);

		//	thenComparing 을 사용해서 구현
		Stream<FailRate> sortedByStreamCompare = failRateSet.stream().sorted(Comparator.comparing(FailRate::getFailRate, Comparator.reverseOrder()).thenComparing(FailRate::getStage));
		Integer[] answer = sortedByStreamCompare.map(x -> x.stage).toArray(Integer[]::new);

		return answer;
    }
}

class FailRate {
		int stage;
		double failRate;

		public FailRate(int stage, double failRate) {
			this.stage = stage;
			this.failRate = failRate;
		}
    
		public int getStage() {
			return stage;
		}

		public void setStage(int stage) {
			this.stage = stage;
		}

		public double getFailRate() {
			return failRate;
		}

		public void setFailRate(double failRate) {
			this.failRate = failRate;
		}
	}

소감

  • Stream은 신이고 나는 병신이다.
  • 처음에는 직접 Comparator을 구현했지만, thenComparing 이라는 편리한 함수가 있다는 것을 알고 이를 통해서 구현했다.
  • 단 한줄로 해결이 되다니...^^
profile
개발하는 중국학과 사람
post-custom-banner

0개의 댓글