반응형

문제 출처 :


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


알고리즘 분석 :


문제 해결에 필요한 사항

1. 문제에 대한 정확한 이해

2. 알고리즘 설계



문제는 다음과 같다.


백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보는 것이 좋겠다.)


백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다.


그런데 올해에는 대회에 참여하려는 학생들 중 K명을 반드시 인턴쉽 프로그램에 참여하라는 학교의 방침이 생기게 되었다.


백준대학교에서는 뛰어난 인재들이 많기 때문에, 많은 팀을 만드는 것이 최선이다.


여러분은 N명의 여학생과 M명의 남학생, K명의 인턴쉽에 참여해야하는 인원이 주어질 때 만들 수 있는 최대의 팀 수를 구하면 된다.





이때 K명을 반드시 인턴쉽 프로그램에 참여하라는 학교의 방침이라 함은,


6 3 2 였을 경우, 여자 6명 남자 3명이 있지만 인턴쉽으로 2명이 빠져야한다.


그렇다면 어떤 경우에 인턴쉽 인원을 빼고 최대 인원을 만들 수 있는가? 그때의 최댓값은 얼마인가?


라는 문제와 동일하다.


자세한 내용은 주석을 통해 달아두었다.



소스 코드 : 


< 문제를 접하고 제작한 코드(정갈화 되지 않았다) >


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
53
54
55
56
57
58
59
60
#include <iostream>
 
using namespace std;
 
int main()
{
    int n, m, k;
    int chk = 1, cnt = 0;
    
    cin >> n >> m >> k;
 
    while (1)
    {
        // 여학생 / 2가 0보다 클 때
        if (n / > 0)
        {
            // 그때 남학생 수가 0보다 클 때
            if (m > 0)
            {
                n -= 2;
                m--;
                cnt++;
            }
            // 남학생 수가 0이라면 (의미가 없으므로 break)
            else if (m == 0)
                break;
        }
 
        else
            break;
    }
 
    // 위의 과정 이후 남은 남학생 수와 여학생수를 k에서 빼준다.
    m > ? k -= m : 0;
    n > ? k -= n : 0;
 
 
    while (1)
    {
        if (cnt == 0)
            break;
 
        // k가 아직 남았다면 계산해준다.
        if (k > 0)
        {
            cnt--;
            k -= 3;
        }
 
        else
            break;
    }
    
    cout << cnt;
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus



< 이 코드에 대해 최대한 숏코딩을 해보았다. >


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
#include <iostream>
 
using namespace std;
 
int main()
{
    int n, m, k;
    int chk = 1, cnt = 0;
    
    cin >> n >> m >> k;
 
    // 여학생 / 2가 0보다 크고, 남학생이 0보다 클 때
    while (n / && m)
    {
            n -= 2// 여학생은 2명 빼주고
            m--// 남자는 1명 빼주고
            cnt++// 카운트는 1 더해준다.
    }
 
    m > ? k -= m : 0// 만약 남은 남학생 수가 있다면 k에서 빼준다.
    n > ? k -= n : 0// 만약 남은 여학생 수가 있다면 k에서 빼준다.
 
    // 남은 k가 있거나 cnt가 0이 아닐때
    // 애초에 위의 while에서 cnt가 0이었다면 바로 break
    while (k > && cnt != 0)
    {
            cnt--;
            k -= 3// cnt -1당 k는 -3(여 2 남 1)
    }
    
    cout << cnt;
 
    return 0;
}
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus

반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[2605번] 줄 세우기  (0) 2016.10.28
[2790번] F7  (0) 2016.10.27
[2193번] 이친수  (0) 2016.10.14
[2910번] 빈도 정렬  (0) 2016.10.09
[1463번] 1로 만들기 (Dynamic Programming)  (2) 2016.10.04