빠른 A+B
문제는 다음과 같습니다.
문제를 요약하자면, 처음에 얼마만큼의 반복 할 것인지를 입력받는 값이 있습니다.
그 값만큼 입력을 받으면서 입력을 받자마자 출력하는 프로그램을 만드는 문제입니다.
이전에도 풀었던 같은 유형의 문제입니다.
이번에는 이전에 가독성이 좋거나 유용했던 다른 사람의 코드들을 기반으로 한번 코딩해봤습니다.
for _ in range(int(input())):
print(sum(map(int,input().split())))
파이썬 개발자들 사이에서는 실제로 사용하지 않을 변수를 _로 표현하는 것이 관례입니다. 이런 컨벤션을 잘 따르면 좋습니다.
입력받은 문자열을 공백으로 나누고, 각각을 정수로 변환한 다음 모두 더하는 과정을 한 줄로 표현했습니다.
이렇게 함수들을 연결해서 사용하는 것을 '함수형 프로그래밍' 스타일이라고 하는데, 파이썬의 이런 특징을 잘 활용했습니다.
특히 map()은 제너레이터 방식으로 동작하기 때문에 메모리 사용이 효율적입니다.
큰 데이터를 처리할 때도 메모리 부담이 적죠. 게다가 중간 변수를 만들지 않고 바로 sum()으로 결과를 계산하니 코드도 깔끔하고 실행도 효율적입니다.
이런 방식의 코딩은 초보자에게는 조금 어려워 보일 수 있지만, 파이썬의 철학과 장점을 잘 살린 훌륭한 코드라고 할 수 있습니다. "Simple is better than complex"라는 파이썬의 철학이 잘 드러나는 예시라고 볼 수 있죠.
하지만 이 코드는 틀린 코드입니다.
시간초과가 발생하게 되죠. 시간 제한이 1초로 제한되어있습니다
. 1초안에 백준에서 정한 모든 테스트 케이스를 수행해야 합니다.
하지만 input()을 반복문안에 넣게 된다면 계속 입력값을 받으므로 현저히 느려집니다.
백준에서 이를 해결하기 위한 기초 sys 를 알려주기 위해 이 문제를 기출했다고 봐도 될 거 같습니다.
바로 sys.stdin.readine입니다.
import sys
input = sys.stdin.readline
for _ in range(int(input())):
print(sum(map(int,input().split())))
실제로 sys가 빠른 건지 직관적으로 보고 싶은 분들은 아래 코드를 실행하시길 바랍니다.
import sys
import time
test_data = "\n".join(["1 2"] * 100000) + "\n"
with open("test_input.txt", "w") as f:
f.write(test_data)
with open("test_input.txt", "r") as f:
start_time = time.time()
for _ in range(100000):
a, b = map(int, f.readline().split())
end_time = time.time()
print(f"input() 실행 시간: {end_time - start_time:.5f}초")
with open("test_input.txt", "r") as f:
start_time = time.time()
data = f.read().splitlines()
for line in data:
a, b = map(int, line.split())
end_time = time.time()
print(f"sys.stdin.readline() 실행 시간: {end_time - start_time:.5f}초")
다음과 같은 출력 결과를 얻을 수 있습니다.
매우 차이가 큽니다.
정답 비율은 약 45%입니다. 이번 문제는 시간초과가 대부분이기 때문에 다른 사람의 오답 코드보다는 정답 코드를 확인해보겠습니다.
코드 동작 흐름
- sys.stdin.readline()을 사용하여 빠르게 입력을 받습니다.
- T(테스트 케이스 개수)를 입력받습니다.
- 각 A, B 값을 입력받아 덧셈 결과를 리스트 C에 저장합니다.
- C.reverse()를 사용하여 결과를 역순으로 변경합니다.
- C.pop()을 사용하여 마지막 값부터 출력합니다.
이는 자료구조를 이용한 방식인데, 사실 큰 차이 없습니다. 또한 자료구조를 혼용해서 사용하고 있습니다. reverse()
하지 않고 하는 법이 있으므로 자료구조 카테고리 '덱'이라는 주제로 찾아뵙겠습니다 :)
'BaekJoon Reivew' 카테고리의 다른 글
단계별로 풀어보기 백준_11022번 (2) | 2025.02.07 |
---|---|
단계별로 풀어보기 백준_11021번 (0) | 2025.02.07 |
단계별로 풀어보기 백준_25314번 (0) | 2025.02.07 |
단계별로 풀어보기 백준_25304번 (0) | 2025.02.06 |
단계별로 풀어보기 백준_8393번 (0) | 2025.02.06 |