본문 바로가기
Algorithm/프로그래머스(Programmers)

[ 파이썬(python) ] 프로그래머스 level1 - 실패율

by YWTechIT 2021. 4. 12.
728x90

📌 실패율

문제 설명


💡 나의 풀이

처음 문제를 풀면서 다음과 같은 방법을 떠올렸다.

  1. 반복문이 진행될 때마다 전체 len의 값이 count만큼 줄어들어야 하므로 stagessort해주고 pop으로 i값을 빼주기: 실패
  2. 이중 반복문을 사용해서 첫 번째 순서를 제외한 나머지 순서는 다음과 같이 선언하기 arr.count(i) / len(arr) - 이전 count(i): 실패
  3. 이전 count로 반복문이 끝나기 전에 전체 len을 빼주기: 성공

결과적으로 3번째 방법으로 풀어서 맞았는데, 1번과 2번 방법으로 1시간 넘게 고민하다가 기운이 다 빠져버렸다. 😅 😅

 

또, 반례를 생각하지 않아서 1, 6, 7, 9, 13, 23, 24, 25번 테스트케이스에서 오답 판정을 받았다.
혹시라도 저 테스트케이스에서 오답 판정을 받았다면 다음 테스트 케이스를 실행해보자!

 

N = 5, stages = [3, 1, 2, 2, 2]

힌트는 다음과 같다.(하단 드래그!)

마지막 stages에서 0명의 사용자가 지원했으므로 분모가 0이 된다. 따라서, 아직 마지막 stages가 끝나지도 않았는데 더 이상 나눌 값이 없다면...? 어떻게 처리를 해줘야 할까? 한번 생각해보자.

 

3번을 이용하여 풀었던 자세한 방법은 다음과 같다.

  1. 전체 stages를 변수로 선언해준다.(한 반복문이 끝날 때마다 이전 count값을 빼줘야 하기 때문이다.)
  2. 반복문에서 현재 i값을 key로, 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수를 value로 선언해준다.
  3. 전체 stages에서 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수를 빼주자.

 

여기까지 진행하게되면, 다음과 같은 출력을 볼 수 있다. ({1: 0.125, 2: 0.42857142857142855, 3: 0.5, 4: 1.0, 5: 0})

 

왜 결과 값을 리스트로 선언하지않고 딕셔너리로 선언했을까? 실패율이 높은 stage부터 내림차순으로 정렬해야 하기 때문이다.

즉, 일반적인 수의 큰값과 작은 값을 기준으로 오름차순 / 내림차순을 하는 게 아니라, 실패율을 기준으로 정렬해야 하기 때문에 key:value형태인 딕셔너리로 선언했다.

 

이제 마지막으로 value값을 기준으로 정렬하는데 내가 작성한 코드는 다음과 같다.
return list(dict(sorted(stages_dic.items(), key=lambda x: x[1], reverse=True)).keys())

  1. stages_dicitemvalue값을 기준으로 정렬한다.
  2. sorted는 자동으로 list로 반환해주기 때문에 dict으로 바꾸고 그중 key값을 반환한다.
  3. return 값이 list이므로 list를 붙여준다.

 

다른 사람의 코드는 다음과 같이 선언할 수 있다.
return sorted(stages_dic, key = lambda x: stages_dic[x], reverse = True)

  1. 딕셔너리에서 sorted를 사용하면 key를 기준으로 정렬하는데 람다 함수를 사용해서 stages_dic[x] 즉, value를 기준으로 정렬한다.
    • 우리가 딕셔너리 value 값에 접근하기 위해서 dic['key']를 사용하는 것과 같은 원리다.

두 번째 코드가 더 간편해 보인다. 기억했다가 나중에 써먹어야겠다.

# 나의 코드
def solution(N, stages):
   stages_dic = {}
   stages_len = len(stages)

    for i in range(1, N+1):
        if stages_len == 0:
            stages_dic[i] = 0
        else:
            stages_dic[i] = stages.count(i) / stages_len
        stages_len -= stages.count(i)

    return list(dict(sorted(stages_dic.items(), key=lambda x: x[1], reverse=True)).keys())

# 다른사람의 코드
def solution(N, stages):
   stages_dic = {}
   stages_len = len(stages)

    for i in range(1, N+1):
        if stages_len == 0:
            stages_dic[i] = 0
        else:
            stages_dic[i] = stages.count(i) / stages_len
        stages_len -= stages.count(i)

    return sorted(stages_dic, key = lambda x: stages_dic[x], reverse = True)
반응형

댓글