[백준] 11441번 - 합 구하기 by Python(파이썬)

윤소영·2023년 7월 16일
0

백준

목록 보기
12/13

✨ 문제

문제 링크 → 백준 11441번 - 합 구하기

✨ 핵심

  • 문제 제한 시간이 1초라는 것
  • 1번째 수 == 인덱스 0

✨ 풀이

간단 풀이

문제 봤을 때 그냥 바로 떠오른 대로 풀어본 방식으로,문제에서 주어진 숫자들 입력받고 인덱스 (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를 사용했을 때와 달리 시간 초과가 발생했다. 왜 그런지는 모르겠지만,, 찾아보니까 제출 시간에 따라 결과가 다르게 나올 수도 있다고 한다. 안정적으로 두 번째 방식으로 푸는 게 더 나을 듯 싶다

profile
Major in IT Engineering(2021.03~)

0개의 댓글