Python Programming/[Programmers] Algorithm

[프로그래머스] 실패율 Python 풀이

간토끼 2023. 8. 22. 00:22
728x90

# 해당 포스팅은 이제 막 알고리즘 공부를 시작한 초보 수준에서 작성했음을 이해해주시고, 비난보다는 따뜻한 조언을 부탁드립니다.


안녕하십니까, 간토끼입니다.

오늘은 프로그래머스(Programmers) 실패율 문제에 대해 다뤄보겠습니다.

2019년 카카오 블라인드 채용 코딩테스트 문제(Lv.1 수준)입니다.

 

1. 문제 링크

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

총 이용자 중 각 스테이지별로 실패한 사람의 비율인 '실패율'을 구해서 실패율이 높은 스테이지부터 내림차순으로 출력하는 문제입니다.

전체 스테이지 수인 N, 이용자가 멈춰있는 스테이지의 번호가 담긴 배열 stages가 입력으로 주어지고,

이를 바탕으로 실패율이 높은 스테이지부터 내림차순으로 출력하면 됩니다.

만약 실패율이 같은 스테이지가 2개 이상 존재한다면, 스테이지 번호가 작은 순서대로 출력하면 됩니다.

 

2. 접근 방법

다음과 같이 접근하였습니다.

전체적인 흐름은 코드를 읽어보시면 유추하실 수 있을 거라 생각하고, 몇 가지 막혔던 것만 짚고 넘어가겠습니다.

(1) 샘플 케이스로 주어진 예제( 4, [4,4,4,4,4] )를 입력해서 실패율을 구하다보면 0으로 나눌 수 없는 에러가 발생하는데요. 즉 0/4 연산에서 에러가 발생하다보니 예외처리를 통해 0으로 바꿔줬습니다.

(2) 마지막 단계를 보시면, 내림차순한 실패율 배열로 스테이지 번호를 구하기 위해 최초 배열의 인덱스를 이용하려고 했는데요. 만약 실패율이 같은 원소가 여러개 존재한다면 단순히 index 함수로는 중복 인덱스를 구할 수 없는 문제가 발생합니다.

예를 들어 실패율을 내림차순했더니 [1/2, 1/2, 1/3, 1/4, 0] 이라고 가정하면 1/2 실패율이 2개죠?

스테이지 순으로 나열된 원래 배열은 [1/3, 1/4, 1/2, 1/2, 0] 이라고 합시다.

그렇다면 실패율이 1/2인 스테이지의 번호는 각각 3스테이지, 4스테이지가 되겠죠.

먼저 index 함수를 이용해 실패율이 1/2인 스테이지의 번호를 구하면 3 스테이지가 되겠고,

이때 원래 배열에서 3 스테이지의 값을 -1 로 바꿔주면 원래 배열은 [1/3, 1/4, -1, 1/2, 0] 가 됩니다.

그리고 다시 인덱스 함수를 이용해 실패율이 1/2인 스테이지의 번호를 구해주면 4 스테이지가 되겠죠.

다소 원초적인 방법인데 제가 아직 알고리즘적인 사고가 부족해서 ... 발상의 전환이 참 어렵네요. ㅜㅜ

 

3. 코드

def solution(N, stages):
    tot_users = len(stages) # Total 사용자 수(분모)
    max_stage = max(stages) # 제일 높은 stage 도달
    stage_cnt = []
    if max_stage > N:
        for i in range(1, max_stage+1): # [1, 2, ..., N]
            cnt = stages.count(i)
            stage_cnt.append(cnt)
        stage_cnt = stage_cnt[:N+1] # N까지만 놔둠 ...
    else:
        for i in range(1, N+1):
            cnt = stages.count(i)
            stage_cnt.append(cnt)
    

    # 실패율 계산
    fail_list = ['']
    fail_list[0] = (stage_cnt[0]/tot_users) #(1/8))
    sum_tot = tot_users

    for i in range(1, N):
        try:
            fail = (stage_cnt[i] / (sum_tot-stage_cnt[i-1]))
        except:
            fail = 0
        fail_list.append(fail)
        sum_tot = sum_tot-stage_cnt[i-1]
    
    # 실패율 = [1/8, 3/7, 2/4, 1/2, 0]
    sort_fail_list = sorted(fail_list, reverse = True) # 내림차순 정렬
    # 내림차순 실패율 = [1/2, 1/2, 3/7, 1/8, 0]

    answer = []
    for j in sort_fail_list:
        # 실패율을 내림차순 정렬하였으므로, j : 실패율(i-th index)
        j_idx = fail_list.index(j)
        answer.append(j_idx+1)
        fail_list[j_idx] = -1
    
    return answer

 

감사합니다.

잘 읽으셨다면 게시글 하단에 ♡(좋아요) 눌러주시면 감사하겠습니다 :)

(구독이면 더욱 좋습니다 ^_^)

* 본 블로그는 학부생이 운영하는 블로그입니다.

따라서 포스팅에 학문적 오류가 있을 수 있으며, 이를 감안해서 봐주시면 감사하겠습니다.

 


- 간토끼(DataLabbit)

- B.A. in Economics, Data Science at University of Seoul

728x90