본문 바로가기
source-code/Algorithm

프로그래머스 _ 실패율

by mattew4483 2021. 2. 17.
728x90
반응형

프로그래머스 _ 실패율

programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr


제일 먼저 든 생각 → 문제가 무지 길다!

다음으로 든 생각 → 일단 각 스테이지의 실패율을 구해야 비교가 가능하겠다!

 

그래서 실패율을 구하러 떠났다.

 

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

 

이를 구하기 위해서는... 우선 각 스테이지 번호를 담은 list가 있어야 한다!

스테이지의 개수가 N으로 주어졌으므로 range(1,N+1)을 list에 담으면 각 스테이지 번호가 담길 테다!

 

다음은 각 스테이지 별 플레이어의 수를 구해야 하는데... 이를 위해 전체 플레이어의 수가 필요하다!

stages에는 각 플레이어가 멈춰있는 스테이지 번호가 담겨 있으므로... 얘의 길이 == 전체 플레이어 수!

 

대망의 실패율 구하기! 단순해 보이지만 제법 고민했다.

 

우선 all_stage를 for문으로 돌려 각 스테이지 번호를 하나씩 가져온다!

1번 스테이지의 실패율 = 1번에 멈춰있는 플레이어 수 / 전체 플레이어 수

2번 스테이지의 실패율 = 2번에 멈춰있는 플레이어 수 / 전체 플레이어 수 - 1번에 멈춰있는 플레이어 수

3번 스테이지의 실패율 = 3번에 멈춰있는 플레이어 수 / 전체 플레이어 수 - 1번&2번에 멈춰있는 플레이어 수

...

일 테다!

 

따라서 stage.count(i)를 통해 i번째 스테이지에서 실패한 유저의 수를 구하고,

이를 all_user로 나눠 줌으로써 실패율(여기서는 how_many)을 구할 수 있다!

얘를 fail이라는 list에 넣어줌으로써 각 스테이지의 순서대로 실패율이 담기게 된다!

 

그런데 i번째 스테이지에 멈춰있는 플레이어가 아무도 없다면? 즉 i not in stages면?

해당 스테이지의 실패율은 0!!! 모두가 성공했다는 뜻이다!

따라서 이 때는 0을 list에 담아준다.

 

그리고 이렇게 실패율을 구한 후에는?

분모가 되는 전체 플레이어 수에서 해당 스테이지에 멈춘 플레이어 수를 빼줘야!

 

각각 1번째, 2번째, ... 5번째 스테이지의 실패율!!! 잘 담긴 걸 확인할 수 있다.

 

이 녀석들을 큰 순서대로 정렬하면 끝!

...이면 참말로 좋겠지만...

 

우리가 return 해야 하는 값은 실패율이 아닌, 실패율이 높은 순서대로 정렬된 스테이지 번호다!!!

그렇다면 실패율과 각 스테이지 번호를 연결시켜줘야 하는데...

→ dict를 통해 이를 해결할 수 있다!!!

즉 각 스테이지 번호를 Key값으로, 실패율을 Value값으로 짝지어주면 될 일!

그럼 그건 어떻게 하는겨?

 

몰랐던 거라 주석에도 적어줬다! zip()을 이용해 가능하다!!!

zip()은 동일한 개수로 이루어진 list를 묶어주는 메서드!

 

우리는 Value를 비교해 Key값을 정렬하는 방식을 사용하고 싶기 때문에... 이 녀석을 dict형태로 바꿔줬다.

 

대망의 마지막!

우리가 하고 싶은 일은 → 실패율이라는 Value를 기준으로 스테이지 번호인 Key를 내림차순 정렬하기!

 

우선 sorted(reverse = True)를 통해 내림차순 정렬을 지정해주고,

sorted(key= ) 을 지정해줌으로써 정렬 기준을 정해줬다!

 

그런데 이 정렬 기준은? fail_dict이라는 dict의 value값!!!

따라서 lambda x : fail_dict[x] ← 요 녀석을 통해 key를 fail_dict의 value로 지정해줬다!!!

 

완성된 코드! 오늘도 10점을 획득했다. 역시 길수록 점수가 높은...?


다른 사람의 풀이!

 

요 풀이를 보니... 굉장히 쓸 때 없는 짓을 했음을 알 수 있었다!

→ 우리는 fail을 list로 만들고, 이 녀석을 다시 dict으로 만들고, 얘를 다시 실패율을 기준으로 한 list로 만들었다.

 

이 무슨 비효율적인 짓!

요 풀이처럼 처음부터 dict형태로 실패율을 담은 후 이를 sorted 해주면 알아서 list가 반환되잖나! 와우!!!

728x90
반응형