상세 컨텐츠

본문 제목

백준#2217 - 로프

C#/알고리즘

by McRobbin 2020. 4. 9. 14:24

본문

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

 

2217번: 로프

N(1≤N≤100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다. 하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다. 각 로프들에 대한 정보가 주어졌을 때, 이 로프들을

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
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _2217
{
    class Program
    {
        static void Main(string[] args)
        {
            long num = long.Parse(Console.ReadLine());
            var ropeList = new List<long>();
            long total = 0;
            long maxWeight = 0;
            for(long i = 0; i < num; i++)
            {
                long input = long.Parse(Console.ReadLine());
                ropeList.Add(input);
                total += input;
            }
 
            ropeList.Sort();
 
            for(int i = 0; i < ropeList.Count; i++)
            {
                if(maxWeight < (ropeList[i] * (ropeList.Count - i)))
                {
                    maxWeight = ropeList[i] * (ropeList.Count - i);
                }
            }
 
            Console.WriteLine(maxWeight);
        }
    }
}
 
 
 

자료의 갯수 num을 받고 num개의 로프를 입력받을 List를 만들었습니다.

long형의 사용은 로프의 갯수(최대 10만)와 견디는 무게(최대 10000)를 곱해서 풀어가는데 int범위를

넘어갈수 있기 때문입니다.

 

입력받은 무게 전부를 곱해 maxWeight에 넣어줍니다. 다음 List를 Sort하면 무게 순서대로 정렬되는데

i번 로프의 무게는 i번 뒤에 나오는 무게보다 전부 작습니다. 이를 이용해 0번의 로프 무게는 전체가 같이

견딜 수 있으며 1번의 로프 무게는 가장 가벼운 것을 제외하고 모두 함께 견딜 수 있습니다.

 

i번의 무게와 (로프의 갯수 - i)를 maxWeight에 업데이트 하며 최종 maxWeight에 남은 수를 출력했습니다.

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

백준#2875 - 대회 or 인턴  (0) 2020.04.11
백준#10610 - 30  (0) 2020.04.10
백준#2884 - 알람시계  (0) 2020.04.09
백준#14681 - 사분면 고르기  (0) 2020.04.09
백준#2577 - 숫자의 개수  (0) 2020.04.08

관련글 더보기