[백준/Python] 11659 구간 합 구하기 4
문제: https://www.acmicpc.net/problem/11659 사용 알고리즘: 누적 합 입력수의 개수 N ( 1 ≤ N ≤ 100,000 )합을 구해야 하는 횟수 M ( 1 ≤ M ≤ 100,000 )N 개의 수M 개의 i, j 쌍 만약 이 문제를 파이썬 내장함수인 sum 을 사용해서 푼다면 시간초과로 실패한다. sum 함수의 시간 복잡도는 O(n) 이고 M 개의 i,j 쌍의 구간 합을 구하기 위해 for 문을 M 번 돌면 총 시간 복잡도는 O(MN) 이 된다. 최대 N 값인 100,000 과 최대 M 값이 100,000 을 곱한 값은 10,000,000,000 로 100 억이 되는데, 컴퓨터가 1초에 계산할 수 있는 횟수는 대략 1억번이다. 문제에서 주어진 제한 시간은 1초이므로 시..
2024. 7. 9.
[Algorithm/알고리즘] 누적합 알고리즘 Prefix Sum
A = [1, 2, 3, 4, 5]# 부분합 = [1, 3, 6, 10, 15] 위와 같은 배열 A 가 있다. 이 배열의 각 부분합을 구해야 할 때 구할 수 있는 방법이 2가지 있다. 1. 각 인덱스를 반복해서 돌면서 구하기 ans = 0for i in range(start, end+1) ans += A[i]위 코드의 시간 복잡도는 O(N) 이며, 각 부분합을 구하기 위해서는 배열의 크기만큼 위 코드를 반복해야 한다. ans = 0for j in range(배열의 크기): for i in range(start, end+1) ans += A[i] 그러므로 총 시간 복잡도는 O(NM) 이 된다. (M: 배열의 크기인 임의의 수) 2. 누적 합 누적 합 아이디어는 배열 A 에 들어있는 값이 바뀌..
2024. 7. 9.
[백준/Python] 11055 가장 큰 증가하는 부분 수열
문제: https://www.acmicpc.net/problem/11055 사용 알고리즘: DP 수열 A 가 주어졌을 때, 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램 구현ex) A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} -> 1, 2, 50, 60 합 113 입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)둘째 줄에는 수열 A를 이루고 있는 Ai(1 ≤ Ai ≤ 1,000) dp[i] -> 수열 A 의 0 번째 인덱스부터 i 번째 인덱스까지의 부분 합 중 가장 큰 부분 합 i 는 현재 위치, j 는 처음~현재 위치까지 수들을 비교하기 위한 인덱스 현재 위치를 고정시켜놓고 현재 위치까지 수열을 돌면서 현재 위치 값과 방문한 수열의 ..
2024. 7. 3.