문제
접근 방법
-
조건을 만족하지 않는 경우를 먼저 생각했다.
-
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개 만큼 리스트를 채우게 된다.