본문 바로가기
Problem Solving/BOJ

[BOJ][Python]11659번 풀이

by NoiB 2022. 6. 25.
반응형

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

 

11659번: 구간 합 구하기 4

첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j

www.acmicpc.net

import sys
ssr = sys.stdin.readline

n,m = map(int, ssr().split())
num = [0] + list(map(int, ssr().split()))
t = [0 for _ in range(n+1)]
for i in range(1,n+1):
    t[i] = t[i-1] + num[i]
for _ in range(m):
    a,b = map(int, ssr().split())
    print(t[b]-t[a-1])

정말 알고리즘 문제는 안풀면 까먹는다는게 실감이 되는 문제였습니다. 예전에 구간합 문제를 분명 풀어봤었는데 문제를 보고 아무 생각없이 dp로 풀어야겠다 하고 입력을 인덱스로 쓰면 딱 좋겠네 싶어서 이차원 리스트로 풀었다가 메모리 초과가 나서 자세히 보니까 데이터 범위가 100000까지 되더군요. 이걸로 2차원 리스트를 만들었다간 메모리 초과가 안나는게 이상할 정도겠죠.

 

구간 합 문제는 사실 dp와 비슷하다고 해도 과언이 아닐 것 같네요. 필요할 때 마다 계산하는게 아니라 미리 계산해서 집어넣어놓는 방식을 요구하니 근본은 같다고 해도 될 것 같아요. 다만 이번 문제같은 경우 2차원 배열이나 리스트를 만드는 건 지양하는게 좋겠죠. 워낙 데이터 범위가 크니까요. 코드가 간단해서 따로 설명을 안드려도 알아보실 것 같지만 간략하게 작성해보면 처음부터 끝까지 원소를 순서대로 더해가면서 새로운 리스트를 만들고 구해야 하는 구간이 주어지면 해당 되지 않는 구간까지의 합을 빼주면 되는 문제입니다. 가령 [1,2,3,4,5]라는 숫자가 입력으로 주어졌다면 구간 합 리스트는 [1,3,6,10,15]일테니 만약 3~5까지의 구간합을 구하라고 한다면 15에서 3을 빼면 답이 나온다는 뜻이죠.

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]2720번 풀이  (0) 2022.06.27
[BOJ][Python]11727번 풀이  (0) 2022.06.26
[BOJ][Python]7662번 풀이  (0) 2022.06.24
[BOJ][Python]1748번 풀이  (0) 2022.06.23