※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 13900번 문제인 순서쌍의 곱의 합이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/13900
13900번: 순서쌍의 곱의 합
첫 번째 줄에는 입력 받을 정수의 개수 N(2 ≤ N ≤ 100,000) 두 번째 줄에는 N 개의 정수가 주어진다. 이때 입력 받는 정수들의 범위는 0이상 10,000 이하이다.
www.acmicpc.net
모든 순서쌍에 대해 일일이 조사하여 합을 구해내는 시간복잡도는 O(N^2)으로, N의 제한이 10만인 이 문제를 해결하기에는 적합하지 않은 시간복잡도이다. 더 나은 방법을 생각해보자.
정수 A가 순서쌍의 두번째 원소인 경우들의 순서쌍의 두 수의 합은 (A보다 앞서 나온 원소들의 합) * A 로 계산할 수 있다.
A보다 앞서 나온 원소들의 합(prefix sum)을 관리해나가면서 문제를 해결하자.
문제의 답이 32비트 정수 자료형으로 담기 어려울 수 있으므로 64비트 정수 자료형을 이용하여 구현하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
ll ans = 0, psum = 0;
int N; cin >> N;
while (N--) {
ll x; cin >> x;
ans += psum * x;
psum += x;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 9933 // C++] 민균이의 비밀번호 (0) | 2022.03.22 |
---|---|
[BOJ 2503 // C++] 숫자 야구 (0) | 2022.03.21 |
[BOJ 23973 // C++] 표적지 옮기기 (0) | 2022.03.19 |
[BOJ 2210 // C++] 숫자판 점프 (0) | 2022.03.18 |
[BOJ 24420 // C++] ピアノコンクール (Piano Competition) (0) | 2022.03.17 |