곰퓨타의 SW 이야기

[프로그래머스 level3 야근지수] 딕셔너리 활용하여 효율성 뿌시기 본문

TIL/프로그래머스

[프로그래머스 level3 야근지수] 딕셔너리 활용하여 효율성 뿌시기

곰퓨타 2021. 9. 21. 00:32

해결해야하는 문제는 다음과 같았다.

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

 

코딩테스트 연습 - 야근 지수

회사원 Demi는 가끔은 야근을 하는데요, 야근을 하면 야근 피로도가 쌓입니다. 야근 피로도는 야근을 시작한 시점에서 남은 일의 작업량을 제곱하여 더한 값입니다. Demi는 N시간 동안 야근 피로도

programmers.co.kr

 

처음에는 다음과 같이 접근하였다.

def solution(n, works):
    answer = 0
    for _ in range(n):
        max_n =max(works)
        if max_n==0 :
            break
        i = works.index(max_n)
        works[i] -= 1

    for work in works :
        answer += work*work

    return answer

하지만 이렇게 접근하는 경우, 효율성 문제에서 통과하지 못한다.

 

 

 

 

효율성을 위해 해시와 같은 딕셔너리 활용을 생각해보았다.

 

 

def solution(n, works):
    answer = 0
    work_dict = {}
    for work in works :
        if work not in work_dict :
            work_dict[work] = 1
        else :
            work_dict[work] += 1

    while n > 0 :
        keys = work_dict.keys()
        max_n = max(keys)
        if n>=work_dict[max_n] :
            n -= work_dict[max_n]
            if max_n-1<0 :
                break
            if max_n-1 not in work_dict :
                work_dict[max_n-1] = work_dict[max_n]
            else :
                work_dict[max_n-1]+=work_dict[max_n]
            del work_dict[max_n]
        else :
            work_dict[max_n] -= n
            if max_n-1<0 :
                break
            if max_n-1 not in work_dict :
                work_dict[max_n-1] = n
            else :
                work_dict[max_n-1]+=n
            break

    keys = work_dict.keys()
    for key in keys :
        answer += work_dict[key] * (key*key)

    return answer

이렇게 해결하였더니 효율성을 통과할 수 있었다 !!

 

Comments