데이터사이언스 기록기📚

[프로그래머스] Level 1_실패율 본문

Coding Test/프로그래머스(Python)

[프로그래머스] Level 1_실패율

syunze 2022. 8. 16. 21:20

문제 유형

2019 KAKAO BLIND RECRUITMENT

 

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

나의 문제풀이

- 분자, 분모 다 0인 경우 0으로 처리해주기

- 딕셔너리 value 값으로 정렬하기

https://velog.io/@kylexid/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%97%90%EC%84%9C-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC-%EC%9E%90%EB%A3%8C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0

 

파이썬 딕셔너리 정렬하기

1. sorted를 이용한 정렬 dict 안의 key를 올림차순으로 정렬한 key 리스트를 반환해준다. 이때 key가 아닌 value로 정렬하려면 lambda를 사용해주면 된다. 1-1. value값 기준으로 정렬하기 value값을 기준으로

velog.io

def solution(N, stages):
    fail_rate = {}
    
    for i in range(1,N+1):
        under, up = 0,0
        for j in stages:
            if i <= j:
                under += 1
            if i == j:
                up += 1
        # 분자, 분모 다 0인 경우 처리해주기
        if under == 0 and up == 0:
            fail_rate[i] = 0
        else:
            fail_rate[i] = up/under
        
    fail_ans = sorted(fail_rate.items(), key = lambda x: x[1], reverse = True)
        
    return [fail_ans[i][0] for i in range(len(fail_ans))]

 

다른 사람의 문제풀이

1) 

 - result[x]는 value로 정렬

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
    return sorted(result, key=lambda x : result[x], reverse=True)

 

2) get, try-except 문 사용

 - try-except문 : 분자,분모 둘 다 0일 경우 처리하는 예외문

def solution(N, stages):
    fail = {}
    for i in range(1,N+1):
        try:
            fail_ = len([a for a in stages if a==i])/len([a for a in stages if a>=i])
        except:
            fail_ = 0
        fail[i]=fail_
    answer = sorted(fail, key=fail.get, reverse=True)
    return answer

 

3) 

def solution(N, stages):
    answer = []
    fail = []
    info = [0] * (N + 2)
    for stage in stages:
        info[stage] += 1
    for i in range(N):
        be = sum(info[(i + 1):])
        yet = info[i + 1]
        if be == 0:
            fail.append((str(i + 1), 0))
        else:
            fail.append((str(i + 1), yet / be))
    for item in sorted(fail, key=lambda x: x[1], reverse=True):
        answer.append(int(item[0]))
    return answer

 

4) Counter, deque 사용 

from collections import Counter
from collections import deque

def solution(N, stages):
    # backup = deepcopy(stages)
    tmpAnswer = []

    sub = len(stages)
    result = Counter(stages)
    result = list(result.items())
    result.sort(key=lambda x: x[0])

    for data in result:
        currPosPlayer = data[1]
        if(data[0]== N+1): # 마지막스테이지 통과한사람이면
            continue
        tmpAnswer.append([data[0], currPosPlayer / sub])
        sub -= currPosPlayer

    # tmpAnswer.sort(key=lambda x: x[1], reverse=True)
    tmpAnswerDict = dict(tmpAnswer)
    dq = deque()

    for i in range(1, N + 1):
        data = tmpAnswerDict.get(i)
        if data == None:
            dq.append([i, 0])
            continue
        dq.append([i, data])
    resultAnswer = list(dq)

    resultAnswer.sort(key=lambda x: x[1], reverse=True)

    answer = []
    for i in range(N):
        answer.append(resultAnswer[i][0])
    return answer

 

리뷰

 - 런타임 에러나는 이유

https://www.acmicpc.net/board/view/22980

 

글 읽기 - 주로 런타임 에러가 발생하는 이유는 무엇인가요?

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 - 분수 표시

https://longflash.tistory.com/588

 

[Python 3] 분수 표시 및 분수 연산

Python에서는 fractions 모듈로 분수를 표현할 수 있다. 이 모듈은 표준 라이브러리라 따로 설치할 필요는 없다. 이 모듈은 클래스 Fraction을 정의하므로 이것을 Import하면 된다. Fraction(분자, 분모) 식

longflash.tistory.com

 

728x90
Comments