본문 바로가기

알고리즘 삽질장

[이코테] 정렬 - 실패율

반응형

해당 포스팅의 문제의 출처는 나동빈님의 이것이 취업을 위한 코딩 테스트 교재를 공부하면서 풀이할 때 본인의 사고 과정 흐름과 문제 풀이를 기록하기 위함 입니다. 

 


문제설명

하단의 프로그래머스 링크 문제이므로 하단의 링크를 참조하자.

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

사고과정

  • 이걸 어떻게 20분 내에..? 20분 내에 풀지 못해서 그냥 여유를 두고 풀었다. 1시간 정도 풀고 나름대로 작성을 해서 제출했지만 70/100점 밖에 맞지 못했다. 런타임 에러가 발생하는데, 시간 복잡도에서 문제가 발생하는 듯 했다. 결국 문제 풀이를 염탐했다..
  • '정렬' 카테고리 문제여서 연습한 정렬 구현 코드에만 집중 했다. 뭐 삽입, 선택, 퀵, 계수 정렬 등등.. 그런데 풀이를 보니 여기서는 파이썬 정렬 라이브러리를 활용했다. 최근에 소스코드 구현만 연습해서 그런지 파이썬 정렬 라이브러리에 익숙하지 않았다. count, find, startswith, endswith 등등.. 이걸 사용할 거라곤 상상도 못했다..
  • N개의 스테이지 이므로 1~N까지 loop를 돌면서 실패율을 계산하자는 아이디어는 일치했는데, 1부터 하나씩 증가하면서 실패율을 계산하는 데 활용하는 분모 업데이트 하는 아이디어가 떠오르지 않았다. 책 풀이를 보면 1일 때 length를 계속적으로 업데이트 해주되 이 때, length에서 당시 loop 차례에서 count한 개수를 빼주도록 한 점이 매우 인상적이었다.. 하 카카오 문제는 너모 어려운 듯 하다..
  • 마지막으로 주어진 stages 배열 길이가 0이라는 반례도 생각하지 못했다.. 고려해야 할 경우의 수가 너무 많다..

풀이(스스로 풀지 못함)

def solution(N, stages):
    length = len(stages)
    result = []
    for i in range(1, N+1):
        count = stages.count(i)
        
        if length == 0:
            fail = 0
        else:
            fail = count / length
        
        length -= count
        result.append((i, fail))
    result = sorted(result, key=lambda x: (-x[1], x[0]))
    answer = [res[0] for res in result]
    return answer
반응형