© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 2399 - 거리의 합

2024-08-15
BOJ
브론즈 II
cpp
원본 문제 보기
수학
구현

문제

BOJ 2399 - 거리의 합

N개의 수가 주어졌을 때, 모든 순서쌍 (i, j)에 대해 |a_i - a_j|의 합을 구하라 (i=j 포함).

입력

첫째 줄에 N, 둘째 줄에 N개의 수가 주어진다.

출력

모든 쌍의 차이 절댓값 합을 출력한다.

예제

입력출력
3 1 3 516

풀이

이중 반복문으로 모든 순서쌍을 순회하며 차이의 절댓값을 합산한다.

  1. N개의 수를 배열에 저장한다
  2. 모든 (i, j) 쌍에 대해 abs(a[i] - a[j])를 누적한다
  3. 값이 커질 수 있으므로 long long 타입을 사용한다
  4. 최종 합을 출력한다

핵심 아이디어: 순서쌍 (i, j)와 (j, i)를 모두 포함하므로 이중 반복문으로 O(N^2)에 직접 계산한다.

코드

#include <iostream>
#include <math.h>
using namespace std;
typedef long long ll;
int n;
ll map[10100];
int main()
{
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
  {
    scanf("%lld", &map[i]);
  }
  ll ans = 0;
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      ans += abs(map[i] - map[j]);
    }
  }
  cout << ans << endl;
}

복잡도

  • 시간: O(N^2)
  • 공간: O(N)