상세 컨텐츠

본문 제목

백준#2875 - 대회 or 인턴

C#/알고리즘

by McRobbin 2020. 4. 11. 16:48

본문

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

 

2875번: 대회 or 인턴

문제 백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보는 것이 좋겠다.) 백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다. 대회에 참여하려는 학생들 중 K명은 반드시 인턴쉽 프로그램에 참여해야 한다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다. 백준대학교에서는 뛰어난 인재들이 많기 때문에, 많은 팀을 만드는 것이 최선이다. 여

www.acmicpc.net

그리디 알고리즘으로 분류된 대회 or 인턴 문제입니다.

 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _2875
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] splitInput = Console.ReadLine().Split(' ');
            int wCount = int.Parse(splitInput[0]);
            int mCount = int.Parse(splitInput[1]);
            int kCount = int.Parse(splitInput[2]);
 
            Program p = new Program();
            if (wCount > mCount * 2)
            {
                //여자의 수가 더 많을 때.
                int diff = wCount - (mCount * 2);
                Console.WriteLine(p.GetTeamCount(wCount - diff, mCount, kCount - diff));
            }
 
            else if (wCount < mCount * 2)
            {
                //팀을 이룰수 있는 남자의 수가 더 많을 때.
                int wRemainder = wCount % 2;
                int needMCount = wCount / 2;
                int newKCount = kCount - (mCount - needMCount) - wRemainder;
                Console.WriteLine(p.GetTeamCount(wCount - wRemainder, needMCount, newKCount));
            }
 
            else
                Console.WriteLine(p.GetTeamCount(wCount, mCount, kCount));
 
        }
 
        public int GetTeamCount(int wCount, int mCount, int kCount)
        {
            if (kCount <= 0)
                return mCount;
            else
            {
                int kRemainder = (kCount % 3 == 0) ? 0 : 1;
                return mCount - kCount / 3 - kRemainder;
            }
        }
    }
}
 
 

우선 여자의 수, 남자의 수, 인턴쉽을 할 학생의 수를 입력 받습니다. 그 다음에 먼저한 작업은

숫자가 적은 성별을 기준으로 팀을 이룰수 있는 남자, 여자의 숫자를 맞춰주는 것입니다. 

 

ex) 여 : 10, 남 : 3일 경우 팀을 이룰 남자의 숫자가 적으므로 여 : 6, 남 : 3까지 맞춰주며 이 과정에서 불필요한

4명의 여자를 인턴쉽에 빼주겠습니다.

 

여 : 21, 남 : 15일 경우 남자 5명이 남습니다. 또한 여자 1명은 팀을 이룰 수 없으므로 이를 함께 계산 했습니다.

여 : 20, 남 : 10으로 맞췄으며 버린 인원수 만큼 인턴을 보낸것으로 하고 인턴쉽 숫자에 빼주었습니다.

 

이 과정은 인턴쉽 숫자가 몇 명인지 관계없이 이루어지는데, 

ex) 여 : 21, 남 : 15, 인턴쉽 : 3 일 경우 여 : 20, 남 : 10, 인턴쉽 : -3이 됩니다. 인턴쉽을 과하게 보내도 관계가 없는 것이 팀을 이룰 숫자가 적은 성별을 기준으로 팀은 무조건 맞춰지게 되어있기 때문입니다.

 

이 과정을 거치고 GetTeamCount함수를 돌리게 됩니다 이 함수에 오는 남, 여의 숫자는 위의 과정을 거친다면

(남자의 수 * 2 == 여자의 수)가 보장됩니다.

 

GetTeamCount에서 인턴쉽 숫자가 0보다 적다면 남자의 숫자가 곧 팀의 숫자가 되며 아니라면 인턴쉽 숫자의 3으로 나눈 몫만큼 빼주며 인턴쉽 숫자의 3으로 나눈 나머지가 0이 아니라면 1을 더 빼주었습니다.

 

ex) 여 : 20, 남 : 10, 인턴쉽 : 7일 경우 4명을 여자에서, 2명을 남자에서 뺄 것입니다. 또한 1명이 더 남으므로 팀 하나가 더 사라져야 합니다.

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

백준#1120 - 문자열  (0) 2020.04.11
백준#1541 - 잃어버린 괄호  (0) 2020.04.11
백준#10610 - 30  (0) 2020.04.10
백준#2217 - 로프  (0) 2020.04.09
백준#2884 - 알람시계  (0) 2020.04.09

관련글 더보기