MapleStory Finger Point

[프로그래머스] 실패율

2024. 8. 9. 09:07Problem Solving/Online Judge

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💬 문제 설명

전체 스테이지 별로 실패율을 구해야 함

실패율 = (스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수) / (스테이지에 도달한 플레이어 수)

 

📌 주의 사항

  • 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.

 

👌 문제 풀이

  1. 스테이지 별로 실패율을 가지고 있는 Map 구현
  2. 스테이지 별로 실패율 계산
  3. keySet()으로 스테이지(key) 정보를 List에 담음(Set -> List)
  4. 실패율(value 기준)로 ketSet을 내림차순으로 정렬
  5. 정렬된 스테이지 정보를 담은 List를 Array로 변환하여 반환

 

💻 코드

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;

class Solution {
    public int[] solution(int N, int[] stages) {
        // 1. Map 구현 - 키: 해당 스테이지 / 값: 실패율
        Map<Integer, Float> map = new HashMap<>();
        
        int left = stages.length;

        // 2. 스테이지 별로 실패율 계산
        for (int i = 0; i < N; i++) {
            int count = getCount(stages, i + 1);
            
            if (count > 0) {
                map.put(i + 1, count / (float) left);
                left -= count;
            } else {
                map.put(i + 1, 0f);
            }
        }
        
        // 3. Map에서 키 정보만 List에 담기
        List<Integer> keySet = new ArrayList<>(map.keySet());

        // 4. Value 값(실패율)으로 내림차순 정렬
        keySet.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return map.get(o2).compareTo(map.get(o1));
            }
        });
        
        // 5. List -> Array
        int[] answer = new int[keySet.size()];
        
        for (int i = 0; i < answer.length; i++) {
            answer[i] = keySet.get(i);
        }
        
        return answer;
    }
    
    // 배열에서 특정 값의 개수 계산
    public int getCount(int[] array, int value) {
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == value) {
                count++;
            }
        }
        return count;
    }
}​

 

🎓 배운 것

  1. keySet(): java.util.Map 객체에 포함된 모든 키(key)를 Set 형태로 반환한다.
  2. Map을 value 값 기준으로 정렬하는 방법
  3. Java에는 배열에서 특정 원소를 count할 수 있는 내장 함수가 없다. → for문으로 직접 구현 || Stream API를 활용
더보기

🎈 Java 8 이상부터는 Stream API를 활용하여 배열에서 특정 원소의 개수를 구할 수 있다.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 1, 4, 1, 5};
        int target = 1;

        long count = Arrays.stream(array).filter(num -> num == target).count();

        System.out.println("The number " + target + " appears " + count + " times.");
    }
}

 

 

'Problem Solving > Online Judge' 카테고리의 다른 글

[프로그래머스] 베스트 앨범  (1) 2024.08.21
[프로그래머스] 주식가격  (0) 2024.08.15
[BOJ] #1759 - 암호 만들기  (0) 2021.06.29
[BOJ] #1987 - 알파벳  (0) 2021.06.29
[BOJ] #9663 - N-Queen  (0) 2021.06.29