문제 링크 → 백준 11441번 - 합 구하기
문제 봤을 때 그냥 바로 떠오른 대로 풀어본 방식으로,문제에서 주어진 숫자들 입력받고 인덱스 (i-1)~(j-1)까지 슬라이싱한 후 sum을 이용해 i번째~j번째 숫자들의 합을 구한 코드이다.
import sys
input = sys.stdin.readline
N = int(input())
nums = list(map(int, input().split()))
for _ in range(int(input())):
i, j = map(int, input().split())
print(sum(nums[i-1:j]))
시간을 단축하기 위해서는 어떻게 할까 고민했는데 일단 합을 구하는 과정이 중복되지 않도록 ans라는 배열에 1~n번째 숫자들의 합을 ans[n]에 저장하도록 하고, 이후에 i, j를 입력받으면
ans[j](1~j번째까지의 숫자 합)
에서ans[i-1](1~(i-1)번째까지의 숫자 합)
을 빼서 i~j번째까지의 숫자 합을 구해 출력하도록 한다.
- 이때 핵심은 입출력에 print, input 함수를 사용하지 않고 sys 모듈 임포트해서 sys.stdin.readline, sys.stdout.write을 사용하는 것이다.
import sys
input = sys.stdin.readline
N = int(input())
nums = list(map(int, input().split()))
ans = [0]*(N+1)
for i in range(1, N+1):
ans[i] = ans[i-1]+nums[i-1]
for _ in range(int(input())):
i, j = map(int, input().split())
sys.stdout.write(str(ans[j]-ans[i-1])+"\n")
생각과 달리 첫 번째 풀이가 시간 초과에 걸리지 않았다. 대신 시간이 오래 걸린 건 사실이지만,, 궁금해서 첫 번째 풀이에서 print 대신 sys.stdin.write을 써봤는데 오히려 print를 사용했을 때와 달리 시간 초과가 발생했다. 왜 그런지는 모르겠지만,, 찾아보니까 제출 시간에 따라 결과가 다르게 나올 수도 있다고 한다. 안정적으로 두 번째 방식으로 푸는 게 더 나을 듯 싶다