※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts