본문 바로가기

프로그래밍/코드분석

[파이썬] level3 야근지수

rect

문제

회사원인 수민이는 많은 일이 쌓여 있습니다. 수민이는 야근을 최소화하기 위해 남은 일의 작업량을 숫자로 메기고, 일에 대한 야근 지수를 줄이기로 결정했습니다. 야근 지수는 남은 일의 작업량을 제곱하여 더한 값을 의미합니다. 수민이는 1시간 동안 남은 일 중 하나를 골라 작업량 1만큼 처리할 수 있습니다. 수민이의 퇴근까지 남은 N 시간과 각 일에 대한 작업량이 있을 때, noOvertime 함수를 제작하여 수민이의 야근 지수를 최소화 한 결과를 출력해 주세요. 예를 들어, N=4 일 때, 남은 일의 작업량이 [4, 3, 3] 이라면 야근 지수를 최소화하기 위해 일을 한 결과는 [2, 2, 2]가 되고 야근 지수는 22 + 22 + 22 = 12가 되어 12를 반환해 줍니다.

접근 방법

수학적인 센스(?)가 필요한 문제인 듯 싶다. 많은 고민을 했던 문제는 아니였다.

  1. works의 원소들을 n을 이용해서 줄여가야 한다.

  2. 어떻게 해야 제곱의 합이 최소가 되야 할지 고민해봐야 한다.

  3. 리스트 중에서 최대값을 줄이는 게 최선이다.

  4. 줄였으면, 다시 최대값을 찾아야 한다.

  5. n=0이 될때까지 반복

나의 풀이

def noOvertime(n, works):
    result = 0

    while n != 0: # n = 0이 될때까지 반복
        max_value = max(works) # 리스트 중에서 최대값을 찾음
        max_index = works.index(max_value) # 최대값의 위치를 찾음
        works[max_index] -= 1 # 최대값을 -1
        n -= 1 # n을 -1

    for i in range(0, len(works)):
        result += works[i] ** 2

    return result

놓친 부분

만약, n이 리스트의 합보다 크다면, 야근을 할 필요가 없다.

좀 더 깔끔한 코드를 소개하면

def noOvertime(n, works):
  if n>=sum(works):
    return 0;

  while n > 0:
    works[works.index(max(works))] -= 1
    n -= 1

  result = sum([w ** 2 for w in works])

  return result

Seokgeun Kim이란 분이 파이써닉하게 잘 풀어냈다.

문제 출처

https://programmers.co.kr/learn/challenge_codes/26

'프로그래밍 > 코드분석' 카테고리의 다른 글

[파이썬] 카카오 블라인드 공채 1번 문제  (1) 2017.09.19
[파이썬] level3 시저암호  (0) 2017.09.03
[파이썬] 사각형의 나머지 한 좌표값 반환하기  (1) 2017.06.10
[파이썬] 다음 큰 숫자(next big number)  (0) 2017.06.10
[파이썬] 팰린드롬(palindrome) 문제  (0) 2017.02.16