청야에몽
청야의 개발 일기
청야에몽
전체 방문자
오늘
어제
  • 분류 전체보기 (156)
    • os (4)
      • Linux (4)
    • Language (32)
      • Python (15)
      • C# (6)
      • Java (11)
    • BaekJoon (92)
      • 단계별로 풀어보기 (81)
      • 누적합 (11)
    • Test (6)
      • 코딩테스트 (6)
      • 42 SEOUL (0)
    • Project (9)
      • 충돌, 피하기 게임 (8)
      • Unreal engine5 CICD 구축 (1)
    • Git & GitHUB (9)
    • Cloud (3)
      • AWS (0)
      • Azure (0)
      • Docker (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • c#
  • 자료형
  • git
  • docker
  • 연산자
  • Linux
  • for문
  • 누적 합
  • 백준
  • java
  • 파이썬
  • Python
  • pygame
  • Revert
  • Reset
  • 재귀 함수
  • 누적합
  • Rebase
  • 리눅스
  • 중첩for문

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
청야에몽

청야의 개발 일기

BaekJoon/누적합

[백준] 합 구하기 - 11441번 문제 (Python)

2023. 3. 30. 15:13
728x90

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

 

11441번: 합 구하기

첫째 줄에 수의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 둘째 줄에는 A1, A2, ..., AN이 주어진다. (-1,000 ≤ Ai ≤ 1,000) 셋째 줄에는 구간의 개수 M이 주어진다. (1 ≤ M ≤ 100,000) 넷째 줄부터 M개의 줄에는

www.acmicpc.net


문제

N개의 수 A1, A2, ..., AN이 입력으로 주어진다. 총 M개의 구간 i, j가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N이 주어진다. (1 ≤ N ≤ 100,000) 둘째 줄에는 A1, A2, ..., AN이 주어진다. (-1,000 ≤ Ai ≤ 1,000) 셋째 줄에는 구간의 개수 M이 주어진다. (1 ≤ M ≤ 100,000) 넷째 줄부터 M개의 줄에는 각 구간을 나타내는 i와 j가 주어진다. (1 ≤ i ≤ j ≤ N)

출력

총 M개의 줄에 걸쳐 입력으로 주어진 구간의 합을 출력한다.

코드 정답

import sys
input = sys.stdin.readline

# 11441
n = int(input())
li = list(map(int, input().split()))

# 누적 합 계산
li_sum = [0] * (n+1)
for i in range(1, n+1):
    li_sum[i] = li_sum[i-1] + li[i-1]

m = int(input())
for a in range(m):
    i, j = map(int, input().split())

    # 범위 합 계산
    print(li_sum[j] - li_sum[i-1])

풀이

입력을 빠르게 받기 위하여 아래 두 문장을 사용하여 sys.stdin.readline 을 사용할 수 있게 만들어주며, 그것을 input에 대입하여 input으로 sys.stdin.readline처럼 사용할 수 있게 만들었습니다.

import sys
input = sys.stdin.readline

이후 정수값 하나를 입력받아 변수 n에 저장하고, 다음 행에는 정수값을 n개 만큼 띄워쓰기를 기준으로 입력을 받아 그것을 각각의 인덱스에 담아 변수 li에 리스트 형식으로 만들어냅니다.

n = int(input())
li = list(map(int, input().split()))

이후 li에 저장된 값들을 이용해 필요한 값들을 계산하여 변수 li_sum에 저장을 하게 됩니다. 값 0이 저장되어 있는 인덱스를 n+1개 만들어 li_sum 변수에 저장합니다. 이후 1이 n+1이 될 때까지 반복을 하며 li_sum[i-1] + li[i-1] 이 계산된 값들을 li_sum[i]에 저장을 합니다. 이렇게 한다면 li_sum[1] 부터 li_sum[n]까지 필요한 값들이 순차적으로 저장이 됩니다.

li_sum = [0] * (n+1)
for i in range(1, n+1):
    li_sum[i] = li_sum[i-1] + li[i-1]

정수값 하나를 입력받아 변수 m에 저장합니다. 이후 m번 반복을 하며 반복이 될 때마다 값 두 개를 입력받아 각각 변수 i와 j에 저장을 합니다. 이후 li_sum[j] 에서 li_sum[i-1]을 빼낸 값을 출력합니다.

m = int(input())
for a in range(m):
    i, j = map(int, input().split())

    print(li_sum[j] - li_sum[i-1])

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'BaekJoon > 누적합' 카테고리의 다른 글

[백준] 부분합 - 1806번 문제 (Python)  (0) 2023.04.01
[백준] 블로그 - 21921번 문제 (Python)  (0) 2023.03.31
[백준] 순서쌍의 곱의 합 - 13900번 문제 (Python)  (0) 2023.03.26
[백준] Maximum Subarray - 10211번 문제 (Python)  (0) 2023.03.24
[백준] 2차원 배열의 합 - 2167번 문제 (Python)  (0) 2023.03.23
    'BaekJoon/누적합' 카테고리의 다른 글
    • [백준] 부분합 - 1806번 문제 (Python)
    • [백준] 블로그 - 21921번 문제 (Python)
    • [백준] 순서쌍의 곱의 합 - 13900번 문제 (Python)
    • [백준] Maximum Subarray - 10211번 문제 (Python)
    청야에몽
    청야에몽
    개인적으로 학습을 하여 까먹지 않기 위해 올리는 블로그입니다.

    티스토리툴바