[Programmers] - 실패율

오동훈·2021년 4월 29일
0

Programmers

목록 보기
31/64
post-thumbnail

1. Problem 📃

🙌 출처 - 프로그래머스 🙌

다음 문제는, 실패율을 구하는 문제입니다. 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
전체 스테이지의 수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 반환하는 문제입니다.

2. Logic 👨‍🏫

  1. 먼저 스테이지별 실패율을 담아낸 후
  2. 실패율이 높은 스테이지를 순서대로 담아냄으로써 이 문제를 해결했습니다.

3. Code 💻

1. 내가 푼 70점짜리 코드

#70점 - 런타임 에러
def solution(N, stages):
    answer = []
    failure = []
    user = len(stages)
    for i in range(1, N+1):
        answer.append(stages.count(i)/user)
        user -= stages.count(i)
    for i in range(len(answer)):
        failure.append(answer.index(max(answer))+1)
        answer[failure[i] - 1] = -1
    return failure

아래의 주어진 조건을 추가하지 않아 런타임 에러가 발생했습니다.
👉 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.

2. 내가 푼 100점짜리 코드

# 100점
def solution(N, stages):
    answer = []  # 스테이지별 실패율을 담아내는 리스트
    failure = [] # 실패율이 높은 스테이지를 담아내는 리스트
    user = len(stages) # 게임에 참가한 총 유저
    for i in range(1, N+1):
        if user != 0:
            answer.append(stages.count(i)/user) # 플레이어수 / 스테이지에 도달한 플레이어 수
            user -= stages.count(i) # 클리어하지 못한 유저를 제외해준다.
        else:
            answer.append(0) # 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
    for i in range(len(answer)):
        failure.append(answer.index(max(answer))+1) # 실패율의 max값의 index를 구해 failure에 삽입
        answer[failure[i] - 1] = -1 # 게속해서 max값을 추출해내기 위해 max를 -1로 변경
    return failure

3. 다른 사람이 푼 코드

# 다른 사람이 푼 코드
def solution(N, stages):
    result = {}
    denominator = len(stages)
    for stage in range(1, N+1):
        if denominator != 0:
            count = stages.count(stage)
            result[stage] = count / denominator
            denominator -= count
        else:
            result[stage] = 0
    print(result)
    return sorted(result, key=lambda x : result[x], reverse=True)

#-------출력을 위한 코드입니다------#
N = 5
stages = [2, 1, 2, 6, 2, 4, 3, 3]
print(solution(N, stages))

4. Feedback 📚

1. 람다(lambda)

람다 함수는 이름이 없는 함수입니다. 람다함수의 장점은 코드의 간결함 및 메모리 절약이라고 생각할 수 있습니다. 쓰이는 형태는 다음과 같습니다.

lambda 인자 : 표현식

# 다음은 두 수를 더하는 함수입니다.

>>> def hap(x, y):
...   return x + y
...
>>> hap(10, 20)
30


# 람다 형식으로는 다음과 같이 표현이 가능합니다.
>>> (lambda x,y: x + y)(10, 20)
30


# example
>>> str_list = ['좋은하루','good_morning','굿모닝','niceday']
>>> print(sorted(str_list, key=lambda x : x[1]))  # 람다
['niceday', 'good_morning', '굿모닝', '좋은하루']

람다함수는 결과부분된 부분을 return 키워드 없이 자동으로 return 해주게 됩니다.

# 3. 다른 사람이 푼 코드

return sorted(result, key=lambda x : result[x], reverse=True)
# lambda는 기준을 result[x], 즉 value로 정렬한다는 뜻 입니다. 따라서 key가 출력되게 됩니다.
profile
삽질의 기록들🐥

0개의 댓글