[코딩테스트][프로그래머스] 실패율

김상욱·2024년 6월 24일

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42889?language=java

JAVA 풀이

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        HashMap<Integer,Float> map=new HashMap<>();
        int total_users=stages.length;
        int[] try_stage_num=new int[N+2];
        for(int i=0;i<total_users;i++){
            try_stage_num[stages[i]]++;
        }
        for(int i=1;i<=N;i++){
            if(try_stage_num[i]!=0){
                map.put(i,(float)try_stage_num[i]/total_users);
            }else{
                map.put(i,0.0f);
            }
            total_users-=try_stage_num[i];
        }
        
        List<Map.Entry<Integer,Float>> list=new ArrayList<>(map.entrySet());
        list.sort(Collections.reverseOrder(Map.Entry.comparingByValue()));
        for(int i=0;i<list.size();i++){
            answer[i]=list.get(i).getKey();
        }
        
        // return map.entrySet().stream().sorted((o1,o2)->Float.compare(o2.getValue(),o1.getValue())).mapToInt(HashMap,Entry::getKey).toArray()
        
        return answer;
    }
}

내 생각

  • 해쉬로 실패율을 담는거 까지는 괜찮았으나 후에 해쉬를 리스트로 변환해서 정렬하고 키값만 가져오는 과정에서 해당 메소드들을 처음 써봐서 오래걸렸다.
  • 전체적인 풀이 과정은 다음과 같다. 해당 스테이지의 인원을 현재 인원으로 나눈 값을 해쉬에 기록하고 다음 스테이지가 되면 전 스테이지에서 멈춘 사람들을 빼주면서 실패율을 계산하면 된다. 해당 해쉬를 for문으로 전부 작성하면 해당 해쉬를 리스트로 변환해서 실패율의 내림차순으로 정렬해주면 된다.
  • Map.Entry를 사용해서 리스트로 변환이 가능하고 그 메소드를 사용해서 정렬기준으로 Value로 맞출 수 있다.
  • 풀이 시간 : 30분

Python 풀이

def solution(N, stages):
  answer = []
  stages.sort()
  count=[0]*(N+1)
  for i in range(len(stages)):
      if stages[i]<=N:
          count[stages[i]]+=1

  length=len(stages)

  fail=[]
  for i in range(1,N+1):
      if length>0:
          value=count[i]/length
          fail.append((value,i))
          length-=count[i]
      else:
          fail.append((0,i))

  fail.sort(key=lambda x:(-x[0],x[1]))
  for i in range(0,N):
      answer.append(fail[i][1])

  return answer

내 생각

  • 각 스테이지의 인원을 파악한 후, for문으로 처음 스테이지에서부터 앞 스테이지 인원을 빼주면서 실패율을 구해주면 된다. 그런 후 sort와 람다 함수를 통해 실패율의 내림차순으로 정렬시키고 스테이지 번호를 담아 출력하면 된다.
  • 풀이시간 : 10분

0개의 댓글