December 11, 2018
시간 제한 | 메모리 제한 |
---|---|
2초 | 128MB |
M과 N이 주어질 때 M이상 N이하의 자연수 중 완전제곱수인 것을 모두 골라
그 합을 구하고 그 중 최솟값을 찾는 프로그램을 작성하시오.
예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 완전제곱수는
64, 81, 100 이렇게 총 3개가 있으므로 그 합은 245가 되고 이 중 최솟값은 64가 된다.
첫째 줄에 M이, 둘째 줄에 N이 주어진다.
M과 N은 10000이하의 자연수이며 M은 N보다 같거나 작다.
M이상 N이하의 자연수 중 완전제곱수인 것을 모두 찾아
첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.
단, M이상 N이하의 자연수 중 완전제곱수가 없을 경우는 첫째 줄에 -1을 출력한다.
60
100
245
64
Python의 내장 함수들을 적절하게 잘 이용하면
Pythonic하면서 간단하게 구현할 수 있다.
문제를 해결하기 전에 우선 완전 제곱수에 대하여 간단히 설명하겠다.
완전 제곱수의 정의는 정수의 제곱으로 된 수로
예를 들어 4
는 2
의 제곱이므로 완전제곱수며
25
의 경우 5
의 제곱이므로 완전제곱수다.
예제의 경우 60
에서 100
사이의 완전제곱수는
64(8 X 8)
, 81(9 X 9)
100(10 X 10)
세 가지다.
해당의 수가 완전제곱수인지 판단하기 위해서는
해당 수의 제곱근이 정수면 해당 수는 완전제곱수다.
a if condition else b
형식이다.a
가 조건이 True
일 때 실행되는 문장b
가 조건이 False
일 때 실행되는 문장이다.내장 함수 사용
등등.. 더 많은 함수들을 사용하긴 했지만 모를만한 함수는 이정도 인 것 같다.
N
부터 M
사이의 list
를 생성한다.True
인 값만으로 새로운 리스트를 생성한다.0
인 경우는 완전제곱수가 없는 경우(-1
출력)sum
함수와 min
함수를 사용하여 합과 최소값 출력sum
함수와 min
함수는 str
형을 반환하지 않기 때문에
문제의 조건과 같이 출력하기 위하여 str
함수를 사용해 해당 값들을
str
형으로 변환하고 값의 출력에 개행(\n
)이 존재하기 때문에
str(sum) + "\n" + str(min)
의 형식으로 출력해준다.
Pythonic Code
from math import sqrt
perf_squ_num = list(filter(lambda x: sqrt(x).is_integer(),
[i for i in range(int(input()), int(input()) + 1)]))
print(-1) if len(perf_squ_num) == 0 else print(str(sum(perf_squ_num)) \
+ "\n" + str(min(perf_squ_num)))
Readable Code
from math import sqrt
M = int(input())
N = int(input())
perf_squ_num = []
for i in range(M, N+1):
if sqrt(i).is_integer():
perf_squ_num.append(i)
if len(perf_squ_num) == 0:
print(-1)
else:
print(sum(perf_squ_num))
print(min(perf_squ_num))
숏코딩 53위!!
숏코딩에 욕심은 없지만 Readable한 코드로 처음에 작성하였다가
더 짧고 Pythonic하게 구현할 수 있을 것 같아 코드를 줄여보았다.
개인적으로는 나쁘지 않게 구현한 것 같다.
Pythonic한 코드와 Readable한 코드 둘 중에 무엇이 정답인지는 판단할 수 없다.
둘 다 알맞은 코드라고 생각한다. 개인적으로는 Pythonic코드가 더 좋다.
✅ 코드는 [여기]에서 확인할 수 있다.