https://www.acmicpc.net/problem/1500
1500번: 최대 곱
세준이는 정수 S와 K가 주어졌을 때, 합이 S인 K개의 양의 정수를 찾으려고 한다. 만약 여러개일 경우 그 곱을 가능한 최대로 하려고 한다. 가능한 최대의 곱을 출력한다. 만약 S=10, K=3이면, 3,3,4는
www.acmicpc.net
- 문제
처음 입력받은 10을 어떻게 3개로 나누어야 최대 곱이 나올지 고민하는 문제이다. 10을 1, 1, 8로 나눌수도 있고 2, 2, 6로 나눌수도 있으며 3, 3, 4 이외에도 여러가지 방법으로 나눌 수 있는데, 이때 3, 3, 4처럼 최대의 곱을 보이는 숫자를 고르면 된다.
- 해설
S와 K가 10 1일 경우와 10 10일 경우에는 고민할 필요도 없이 10 한 개와 1 열 개로 나누면 되므로 문제가 될 것이 없다. 이제 나머지의 경우 두 가지로 나눌 수 있다.
1. 나누었을 때 딱 맞아 떨어지는 경우(20 5은 20/5 == 4)
- 이 경우에는 4를 5번 곱한 값이 가장 큰 값이 나온다. 다른 경우도 마찬가지로 S를 K로 나누었을 때 소수점이 없는 숫자가 나온다면 해당 값을 K번 곱해주면 가장 큰 최대 값이 나온다.
2. 나누었을 때 딱 맞아 떨어지지 않는 경우(20 3은 20/3 ~= 6.??)
- 이 경우에는 첫 번째 예시 10 3처럼 3*3*4가 가장 큰 숫자일 것이다. 이 때 10/3을 하면 3.??가 나오므로 3과 4 이 두 수를 이용해야 한다는 것을 알 수 있다. 이때 최대값을 보이기 위해서는 3보다 4를 우선적으로 사용해야 하기 때문에 3을 곱해주되, 최대한 4를 많이 곱해주는 방식으로 진행해야 한다.
로 해결할 수 있을 것이다.
- 풀이
import sys
S, K = map(int, sys.stdin.readline().split())
temp = S//K
max = 1
used = 0
skipped = 0
if S/K == S//K:
for _ in range(K):
max *= temp
else:
for i in range(K):
if (K-i)*(temp+1) == S-used:
skipped = K-i
break
used += temp
max *= temp
if skipped != 0:
for _ in range(skipped):
max *= (temp+1)
print(max)
if S/K == S//K의 경우는 경우 1번에 해당하고 else가 경우 2번에 해당한다. 경우 2번의 경우 S/K의 결과가 3.??라고 했을 때 3을 곱해주면서 K를 계속 줄여나간다. 이때 총 남은 값이 (K-i)*4가 성립하면 나머지는 4로 모두 곱해주면 되기 때문에 예외처리를 하도록 한다. 결국 3을 계속 곱해주면서 4로 나머지를 곱해줄 수 있는 위치를 찾는 것이 핵심이다.
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준][파이썬] 2508번 : 사탕 박사 고창영(코드, 해설, 풀이) (0) | 2022.05.01 |
---|---|
[백준][파이썬] 1439번 : 뒤집기(코드, 해설, 풀이) (0) | 2022.04.17 |
[백준][파이썬] 4796번 : 캠핑(코드, 해설, 풀이) (0) | 2022.04.13 |
[백준][파이썬] 1049번 : 기타줄(코드, 해설, 풀이) (0) | 2022.04.12 |
[백준][파이썬] 1059번 : 좋은 구간(코드, 해설, 풀이) (0) | 2022.04.09 |