상세 컨텐츠

본문 제목

백준#2399 거리의 합

C#/알고리즘

by McRobbin 2020. 5. 7. 09:32

본문

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

 

2399번: 거리의 합

첫째 줄에 n(1 ≤ n ≤ 10,000)이 주어진다. 다음 줄에는 x[1], x[2], x[3], …, x[n]이 주어진다. 각각은 0 이상 1,000,000,000 이하의 정수이다.

www.acmicpc.net

정렬 문제로 분류된 거리의 합 입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _2399
{
    class Program
    {
        static void Main(string[] args)
        {
            int count = int.Parse(Console.ReadLine());
            var numList = Console.ReadLine().Split(' ')
                .Select(x => ulong.Parse(x)).OrderBy(x => x).ToList();
 
            ulong ans = 0;
            for(int i = 0; i < count / 2; i++)
            {
                int mult = numList.Count - (i * 2- 1;
                ulong targetNum = numList[numList.Count - i - 1- numList[0 + i];
                ans += targetNum * (ulong)mult;
            }
 
            Console.WriteLine(ans * 2);
        }
    }
}
 
 
 

풀이

ex) 5

3 2 4 1 5

 

이걸 정렬하면 일직선상에 1, 2, 3, 4, 5 이런식으로 나오며

1과 2사이, 2와 3사이, 3과 4사이, 4와 5사이 이런식으로 4개의 구간이 나옵니다.

 

n^2번 돌려 모든 점사이의 거리를 구할 수도 있겠지만 1만개의 갯수를 돌리면 시간 초과가

날수도 있겠다는 생각이 들었습니다.

 

가장 왼쪽과 가장 마지막 (1과 5) 사이의 거리를 보면 특이한 점이 하나 있습니다.

 

1 ~ 5는 1~2, 2~3, 3~4, 4~5 사이의 거리를 합한것과 같습니다.

또한 1~3, 3~4, 4~5 사이의 거리르 합한 것과도 같습니다.

 

이를 행렬로 표현 했습니다.

   1  2  3  4  5

1 0  1  2  3  4

2 1  0  1  2  3

3 2  1  0  1  2

4 3  2  1  0  1

5 4  3  2  1  0

 

이런 식으로 나오게 되는데 [1, 2]는 1과 2사이의 거리 입니다.

 

1부터 5사이의 거리를 한번 구하면 [1,2], [2,5]의 합이 구해집니다.

두번 구하면 [1,3], [3, 5]가 구해지며 세번 구하면 [1,4], [4,5]

다섯번 하게 될 시 [1,5]가 구해집니다.

 

마찬 가지로 2 ~ 4의 거리또한 [2,3], [3, 4]가 한번, [2,4]가 한번 구해집니다.

 

이것을 O(n)시간 하여 최종답을 구했습니다.

'C# > 알고리즘' 카테고리의 다른 글

백준# 1074 - Z  (0) 2020.05.10
백준#1377 - 버블 소트  (0) 2020.05.09
백준# 1213 - 팰린드롬 만들기  (0) 2020.05.04
백준#3020 - 개똥벌레  (0) 2020.05.04
백준# 2959 - 거북이  (0) 2020.05.03

관련글 더보기