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

2025. 2. 13. 14:29·알고리즘문제풀이

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제이해

말 그대로 각 스테이지의 실패율을 구해서 실패율이 큰 스테이지 번호 순서대로 추출하는 문제였다.

문제 이해는 예시를 보니 이해가 딱 가서 음 금방 풀 수 있겠군 하면서 자신있게 풀기 시작했다.


문제풀이(내가 푼 코드)

def solution(N, stages):
    answer = []
    bm = []
    bj = []
    temp = []
    ratio = []

    for i in range(1, N+1):
        bj.append(stages.count(i))
        bm.append(len(stages))

    for j in range(len(bj)):
        t = bm[j] - sum(bj[:j+1])
        temp.append(t)

    for k in range(1, N):
        bm[k] = temp[k-1]

    for x in range(N):
        # 런타임에러 해결
        if bm[x] == 0:
            ratio.append(0)
        else:
            ratio.append(bj[x] / bm[x])

    answer = [idx+1 for idx,val in sorted(enumerate(ratio), key=lambda x : x[1], reverse=True)]

    return answer

print(solution(5,[2, 1, 2, 6, 2, 4, 3, 3]))
print(solution(4,[4,4,4,4,4]))

 

먼저 나는 분자와 분모를 각각 구한 후 실패율을 구하려고 했다.

 

분자는 각 stages의 개수를 세는 것으로 구하였고,

분모는 먼저 stages의 길이를 구한 후 1번째 인덱스부터는 temp 리스트를 이용해서 값을 갱신해주었다.

알고보니 나는 분모를 엄청 복잡하게 구했다!!

 

분자와 분모를 이용해 실패율을 ratio 리스트에 저장하였고,

enumerate와 sorted(), lambda를 이용해 실패율이 큰 스테이지 번호 순서대로 추출했다.

 

enumerate를 이용해서 idx와 val값을 동시에 나타낼 수 있었고, sorted()함수와 reverse를 이용해 내림차순으로 정렬할 수 있었다. 여기서 lambda x: x[1]은 val값을 기준으로 정렬한다는 뜻이다. 그리고 idx+1을 사용해 1부터 시작하는 스테이지 번호를 반환하였습니다.

 

그리고 예시 정답을 맞춘 후 정답을 제출하니 몇몇 예시에서 런타임에러가 발생하였다.

그 이유는 분모가 0일 때, 에러가 발생했기 때문이다.

보통 백준을 이용해서 풀 때 ZeroDivisionError라고 뜨는데 프로그래머스는 뜨지 않아 오류 찾기가 좀 더 힘든 것 같다..

 

에러까지 해결하고 정답을 맞췄다. 하지만 내가 너무 복잡하게 푼 느낌이라 다른사람의 풀이도 보고 chatGPT의 풀이도 참고해 다시 한 번 문제를 살펴보았다.


문제풀이(chatGPT)

def solution(N, stages):
    bj = [stages.count(i) for i in range(1, N+2)]  # 각 스테이지에서 머물러 있는 플레이어 수
    bm = [len(stages)]  # 처음 전체 인원 수

    for i in range(1, N+1):
        bm.append(bm[i-1] - bj[i-1])  # 해당 스테이지에 도달한 인원 수 갱신

    ratio = []
    for i in range(N):
        if bm[i] == 0:
            ratio.append((0, i+1))  # 실패율이 0인 경우도 포함
        else:
            ratio.append((bj[i] / bm[i], i+1))  # (실패율, 스테이지 번호) 저장
 
  
    # 실패율 내림차순, 같으면 스테이지 번호 오름차순 정렬
    answer = [stage for _, stage in sorted(ratio, key=lambda x: (-x[0], x[1]))]  
    return answer

print(solution(5,[2, 1, 2, 6, 2, 4, 3, 3]))
print(solution(4,[4,4,4,4,4]))

 

chatGPT의 풀이에는 분모를 구하는 방법이 엄청 간결하다. 분자를 구할 때 1부터 N+2까지 리스트를 저장해두니 나처럼 temp를 이용 안해도 밑의 IndexError가 나지 않아 간결한 코드가 완성되었다.

IndexError: list index out of range

 

그리고 나와 다르게 reverse를 사용하지 않고 마이너스 기호를 이용해 내림차순으로 작성했다.

 

내가 푼 코드의 길이와 현저한 차이가 나지만.. 나도 풀었다는 것에 만족!

저작자표시 비영리 변경금지 (새창열림)

'알고리즘문제풀이' 카테고리의 다른 글

[백준/Python] 1260번 DFS와 BFS  (0) 2025.02.17
[백준/Python] 2579번 계단 오르기  (0) 2025.02.14
[백준/Python] 1002번 터렛  (0) 2025.02.12
[백준/Python] 2805번 나무 자르기  (0) 2025.02.11
[백준/Python] 18110번 solved.ac  (0) 2025.02.10
'알고리즘문제풀이' 카테고리의 다른 글
  • [백준/Python] 1260번 DFS와 BFS
  • [백준/Python] 2579번 계단 오르기
  • [백준/Python] 1002번 터렛
  • [백준/Python] 2805번 나무 자르기
jungyn
jungyn
jungyn 님의 블로그 입니다.
  • jungyn
    jungyn 님의 블로그
    jungyn
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 알고리즘문제풀이 (31)
      • 제로인턴 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    너비우선탐색
    스택 수열
    2차원행렬
    교점개수
    수들의 합 2
    제로인턴
    BFS
    카드1
    2108
    프로그래머스
    스택 2
    사전직무교육
    통계헉
    후기
    1847
    다이나믹프로그래밍
    11729
    2606
    백준
    2563
    2161
    SYS
    스택
    1629
    DP
    counter
    시간초과
    18110
    solved.ac
    28278
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jungyn
[프로그래머스/Python] 실패율
상단으로

티스토리툴바