[BAEKJOON] 백준 15780: 멀티탭 충분하니? (C#)

2024. 6. 18. 19:54IT/BaekJoon

문제 링크

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

 

 

문제

오늘은 NAVER D2 캠퍼스에서 CTP 스터디 하는날!!! 스터디 장소가 인하대학교 강의실에서 NAVER D2 캠퍼스로 바뀌었기 때문에 멀티탭 부장 준호는 스터디 전에 미리 멀티탭을 셋팅 해야 한다. CTP는 모든 사람이 사용할만큼 충분한 멀티탭을 가지고 있다. 종류는 3구부터 8구까지 다양하게 있다. 모든 사람들은 노트북만 가져오기 때문에 멀티탭 1구를 무조건 사용한다. 1구를 초과해선 안 된다.

CTP에는 멀티탭에 2개이상 연속으로 코드를 꽂으면 안되는 특별한 규칙이 있다. 준호는 미리 계산을 해서 모두가 코드를 꽂을 수 있게 멀티탭을 K개 챙겨 갔다. 

하지만 준호는 수학과에서 수학을 못해 전과했기 때문에 가끔 멀티탭을 적게 가지고 올 때가 있다. 수학을 더 잘하는 여러분이 멀티탭을 충분히 챙겨왔는지 준호에게 알려주자

최초 전기 공급원(벽면 콘센트)는 총 K개이고, 각각의 멀티탭은 개별적으로 전기를 공급받는다. 즉, 멀티탭을 다른 멀티탭에 이어서 연결하는 경우는 없다.

 

 

입력

입력의 첫째 줄에 스터디에 온 학생의 수 N(1 ≤ N ≤ 100)명 멀티탭의 수 K(1 ≤ K ≤ 100)가 주어진다. 이후 두 번째 줄에 각 멀티탭 구의 수 A[i](3 ≤ A[i] ≤ 8) 가 주어진다. 

 

 

출력

모든 사람이 멀티탭에 코드를 꽂을 수 있는경우 “YES” 아니라면 “NO”를 출력한다.

 

 

 

통과한 답안

namespace _15780
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int N = int.Parse(inputs[0]);
            int K = int.Parse(inputs[1]);
            int[] arr = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            double available = arr.Select(x => Math.Ceiling(x / 2.0)).Sum();
            Console.WriteLine(available >= N ? "YES" : "NO");
        }
    }
}

 

참가자의 수 N과 멀티탭의 수 K, 각 멀티탭의 구의 수 Ai가 주어졌을 때,

참가자가 모두 노트북을 충전할 수 있는지를 확인하는 문제이다.

조건으로는 멀티탭에 연속으로는 연결할 수 없다는 조건이 있다.

(코드 사이에 빈 공간이 있어야 된다는 뜻이다)

 

따라서 최대한으로 많이 연결하는 경우는 홀수번째 구에 코드를 연결하는 것이다.

따라서 주어진 멀티탭에 연결할 수 있는 경우는 (구의 수 / 2)의 올림값이다.

 

이를 코드로 구현하면 위와 같은데,

모든 멀티탭의 구의 수를 구하는 과정에서 for문을 사용하지 않고

LINQ를 사용해서 Select(x => Math.Ceiling(x / 2.0)).Sum()으로 표현하였다.

(모든 원소에 대해서 2로 나눈 값을 올린 후에 더한 결과를 가져온다는 표현)