본문 바로가기

프로그래밍/코드분석

[파이썬] (level4) 최고의 집합

(level4)최고의 집합

문제

스크린샷, 2017-11-05 17-14-57

접근 방법

  1. 조건을 만족하지 않는 경우를 먼저 생각했다.

  2. Sum // n을 먼저 해야된다고 생각했다.

위 두 생각을 통해 접근하기로 생각했고, 10분 정도가 걸렸다.

나의 풀이

def bestSet(n, s):
    if n > s:
        return [-1]

    else:
        element = s // n
        answer = [element] * n
        if sum(answer) != s:
            diff = s - sum(answer)
            for i in range(1, diff+1):
                answer[-i] += 1
            return answer

    return answer

우선, n이 sum보다 크다면 배열을 만들 수가 없다. 이 경우에는 return [-1]을 한다.

element = s // n # 만약 n=8, S=80이면 몫은 9가 된다.
answer = [element] * n

일단 정수몫을 원소로 가지는 n길이의 만큼의 배열을 생성한다.
배열을 생성한 뒤, 합을 구해서 sum과 같은지 검사한다. 아니라면 나머지를 균등하게 +1씩 더해준다.

다른 사람의 풀이

def bestSet(n, s):
    return [s//n] * (n - (s % n)) + [s//n + 1] * (s % n) if n<=s else [-1]

리스트 컴프리헨션으로 표현한 멋진 방법이다.
(n-s % n)이라고 표현한 부분에서 한 가지를 배웠다.

% 나머지 연산자가 - 연산자보다 우선한다.

위 풀이는 나머지(remainder)가 Quotient보다 클 수 없다는 점을 잘 활용한듯 하다. (즉, r<Q)
n이 S를 나누어떨어뜨리게 하는 수라면 n - (s % n)은 n개 만큼 리스트를 채우게 된다.

출처

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