지금은마라톤중

[백준] 1977번 완전제곱수 / input()과 sys.stdin.readline() 차이 본문

STUDY/Python 알고리즘

[백준] 1977번 완전제곱수 / input()과 sys.stdin.readline() 차이

달리는중 2022. 10. 5. 00:23

 

https://www.acmicpc.net/problem/1977

 

1977번: 완전제곱수

M과 N이 주어질 때 M이상 N이하의 자연수 중 완전제곱수인 것을 모두 골라 그 합을 구하고 그 중 최솟값을 찾는 프로그램을 작성하시오. 예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 완

www.acmicpc.net

처음에 이렇게 작성을 해서 실패하였다.

시간초과로 실패를 한 것은 처음이다.

#1977번- 시간초과로 실패
a = int(input())
b = int(input())
lst=[]
for i in range(a,b+1):
    for s in range(2,i):
        if s**2==i:
            lst.append(i)
lst.sort()
if len(lst)==0:
    print(-1)
else: 
    print(sum(lst))
    print(lst[0])

for 문이 많아서 시간이 오래걸린다고 판단했다.

import math  
a = int(input())
b = int(input())
lst=[]
for i in range(a,b+1):
    if int(math.sqrt(i))**2 == i :
        lst.append(i)

if len(lst)==0:
    print(-1)
else: 
    print(sum(lst))
    print(min(lst))

그래서 for문을 줄이고 제곱근을 활용하였다.

완전제곱수일 때만 제곱하였을 때 원래의 값이 나오기 때문에 이를 이용하였다. 

 


이 방법 외에 시간을 줄일 수 있는 방법을 찾아보다가 입력값을 받는 차이에 대해 알아보았다.

 

input() 과 sys.stdin.readline() 차이

속도 차이가 나는 이유는?
input() :
- 개행 문자 없이 반화되고, prompt message를 받을 수 있다는 특징
-사용자가 입력하는 값 하나하나마다 버퍼에 저장하는 특징

sys.stdin.readline() :
- 개행 문자가 입력 끝에 포함되고, prompt message를 받아 출력하는 기능이 없어 상대적으로 빠름
- 개행문자까지 포함한 하나의 줄을 한번에 버퍼로 입력 받음
* 참고
strip() : 문자열의 맨 앞, 맨 끝의 공백을 제거
.rstrip() : 오른쪽에서, lstrip() : 왼쪽에서 공백 제거

 

이제까지 input()만을 사용했는데  sys.stdin.readline()의 장점을 알았으니 sys.stdin.readline() 사용하여 연습해야겠다.

 

Comments