백준 15552번 문제
빠른 A+B
문제
결과
문제에 이상한 이야기가 있길래 읽어보니, input()의 속도에 관한 내용이었다.
그래서 이 문제는 많은 테스트양으로 input()을 사용했을때, 타임아웃이 되게 설정한 문제인것으로 파악을 했다.
하지만 input()을 사용하게 되면 어떻게 되는지 한번 테스트를 해보니, 말 그대로 타임아웃으로 체점이 되게된다.
input()은 반복문에서 입력이 많아지면 속도가 느려지기 때문에, 다른 방식을 사용한다.
sys.stdin.readline() 이 빠른 이유는 비교를 해봐야 한다.
- input()
- sys.stdin.readline()을 래핑 한 함수로, 입력을 읽고, 검사하고, 예외처리 후 " \n " 을 제거 후 데이터를 문자열로 반환한다.
- sys.stdin.readline()
- 바로 입력된 데이터를 처리하지 않고 바로 읽어온다.
- 래핑처리가 안되어 있기 때문에 빠른 속도로 처리가 가능하지만 " \n "이 포함되어 있기 떄문에 strip()을 사용해서 지워야 한다.
이러한 차이로 인하여 속도의 차이를 보는 것이다.
sys.stdin.readline()을 사용해서 문제를 풀어보자.
import sys
a = int(sys.stdin.readline())
for i in range(a):
b, c = map(int, sys.stdin.readline().strip().split())
print(b+C)
결과는 32412kb의 메모리를 사용해서 1284 ms의 속도로 답변을 주었다.
이때 재미난 글을 보게 된다.
입력값과 마찬가지로, 출력값 또한 많다면 출력값의 속도를 줄일 수 있는 방법도 있다! 라는 것이다.
이는 래핑처리라기보다 메모리에 저장해서 한번에 출력하기 때문에 속도는 빠르지만, 메모리는 더 사용하는 방식이었다.
sys.stdout.write()를 사용해서 문제를 풀어보자.
import sys
a = int(sys.stdin.readline())
result = []
for i in range(a):
b, c = map(int, sys.stdin.readline().strip().split())
result.append(str(b + c))
sys.stdout.write("\n".join(result) + "\n")
이렇게 문제를 풀게되면 메모리는 97572kb를 사용하지만 속도는 1064ms로 줄어 든 것을 볼 수 있었다.
이때 왜 write에 " \n " (개행문자) 를 삽입해야하냐면, realine과 마찬가지로 개행문자까지 읽어오니, 출력시에도 개행문자를 넣어야 제대로 출력이 되게 된다.
결과값이 한줄띄움으로 하나씩 하니 마지막에도 개행문자를 추가해주는 것이 맞을거 같다.
Coding_Test/백준/Bronze/15552. 빠른 A+B at main · K-MarkLee/Coding_Test
Coding_Test/백준/Bronze/15552. 빠른 A+B at main · K-MarkLee/Coding_Test
This is an auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - K-MarkLee/Coding_Test
github.com
'코딩테스트 > BaekJoon' 카테고리의 다른 글
백준 파이썬 코딩테스트 (A+B -8) (0) | 2025.02.27 |
---|---|
백준 파이썬 코딩테스트 (A+B -7) (0) | 2025.02.26 |
백준 파이썬 코딩테스트 (코딩은 체육과목 입니다) (0) | 2025.02.24 |
백준 파이썬 코딩테스트 (영수증) (0) | 2025.02.24 |
백준 파이썬 코딩테스트 (합) (0) | 2025.02.24 |