본문 바로가기
알고리즘/PROGRAMMERS

실패율(Lv.1)

by 현대타운301 2024. 3. 22.

 


 

문제 설명

 

 

 

입출력 예시

 

 

요약

실패율 = 아직 클리어하지 못한 플레이어 수 / 도전한 인원

 


 

풀이

 

문제 해석

실패율이 높은 순서대로(서로 같은 스테이지가 있다면 스테이지 순서대로) return

 

 

접근 방식

1. 도전 인원 map 구성

  → 1번 스테이지 도전인원: stages.length, 나머지 스테이지: 이전 스테이지의 도전인원 - 실패인원

 

2. 실패율이 같은 경우 스테이지 순서대로 담기

  → Queue 형식으로 객체를 꺼내 조회하면서 stream().anyMatch() 메소드를 통해 가장 작은 스테이지인지 추가로 확인

 


 

코드리뷰

 

import java.util.*;

class Solution {
    class FailRate {	// 실패율과 스테이지를 담을 객체 클래스
        double rate;
        int stage;
        public FailRate(int stage, double rate) {
            this.rate = rate;
            this.stage = stage;
        }
    }
    public int[] solution(int N, int[] stages) {
        HashMap<Integer, Integer> map1 = new HashMap<>();	// 실패인원 map
        HashMap<Integer, Integer> map2 = new HashMap<>();	// 도전인원 map
        List<FailRate> list = new ArrayList<>();
        List<Integer> answerList = new ArrayList<>();
        for(int i = 1; i <= N; i++) {
            map1.put(i, 0);	// 실패한 인원이 없을 경우를 대비해서 0으로 초기화
        }
        for(int i = 0; i < stages.length; i++) {
            map1.put(stages[i], map1.getOrDefault(stages[i], 0) + 1);
        }
        for(int i = 0; i < map1.size(); i++) {
            if(i == 0) {
                map2.put(i+1, stages.length);	// 첫 번째 스테이지의 도전인원
            } else {
                map2.put(i+1, map2.get(i) - map1.get(i));	// 각 스테이지 도전인원: 이전 스테이지 도전인원 - 실패인원
            }
        }
        for(int i = 1; i <= N; i++) {
            FailRate obj;
            if(map1.get(i) == 0 && map2.get(i) == 0) {
                obj = new FailRate(i, (double)0);	// 도전인원과 실패인원 모두 0일 경우
            } else {
                obj = new FailRate(i, (double)map1.get(i)/map2.get(i));	// 실패율 객체 생성
            }
            list.add(obj);	// 실패율 리스트에 담기
        }
        while(!list.isEmpty()) {
            FailRate objOut = list.remove(0);	// 첫 번째 요소 꺼내서
            if(list.stream().anyMatch(others -> others.rate > objOut.rate)) {	// 실패율이 더 큰 요소가 있으면
                list.add(objOut);	// 맨뒤에 다시 넣는다.
            } else {
                if(list.stream().anyMatch(others -> (others.rate == objOut.rate) && (others.stage < objOut.stage))) {
                    list.add(objOut);	// 실패율이 같은 요소 중에 스테이지가 빠른 요소가 있다면 맨뒤에 다시 넣는다.
                } else {
                    answerList.add(objOut.stage);	// 모두 아니라면 꺼낸 객체의 스테이지를 answerList에 담는다.
                }
            }
        }
        System.out.println(answerList);
        int[] answer = new int[answerList.size()];
        for(int i = 0; i < answer.length; i++) {
            answer[i] = answerList.get(i);
        }
        return answer;
    }
}

 

 

 

'알고리즘 > PROGRAMMERS' 카테고리의 다른 글

전화번호 목록(Lv.2)  (0) 2024.03.22
타겟 넘버(Lv.2)  (0) 2024.03.22
다트 게임(Lv.1)  (0) 2024.03.22
체육복(Lv.1)  (0) 2024.03.21
완주하지 못한 선수(Lv.1)  (0) 2024.03.21