수학과의 좌충우돌 프로그래밍

[C++] BAEKJOON 2875 대회 or 인턴 본문

알고리즘/C++

[C++] BAEKJOON 2875 대회 or 인턴

ssung.k 2019. 9. 15. 00:59

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

 

2875번: 대회 or 인턴

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

www.acmicpc.net

그리디 알고리즘 을 이용해서 문제를 두 가지 방법으로 해결하였습니다.

  1. O(K)

    남녀의 인원 수를 비교하며 팀의 개수를 최대로 할 수 있는 최상의 인원을 맞추기 위해 한 명씩 빼주었습니다.

    #include <iostream>
    
    using namespace std;
    
    int main(int argc, const char * argv[]) {
        int N,M,K;
        cin >> N >> M >> K;
        // 2명의 여학생과 1명의 남학생이 팀
        
        for (int i=0;i<K;i++){
            if (N/2 >= M){
                N--;
            }
            else M--;
        }
        
        int teamNum;
        teamNum = min(N/2, M);
        cout << teamNum << "\n";
        return 0;
    }
    

     

  2. O(1)

    총 3가지 경우를 비교해줍니다.

    • N 과 M 의 수가 큰 차이가 없을 때

      (N+M-K)/3

    • N 이 M 보다 많이 클 때

      M

    • N이 M 보다 많이 작을 때

      N/2

    #include <iostream>
    
    using namespace std;
    
    int min3(int a, int b, int c){
        return min(min(a,b),c);
    }
    
    int main(){
        int N,M,K;
        cin >> N >> M >> K;
        
        cout << min3((N+M-K)/3, N/2, M) << "\n";
        
    }
    

     

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

[C++] BAEKJOON 1080 행렬  (0) 2019.09.16
[C++] BAEKJOON 10610 30  (0) 2019.09.15
[C++] BAEKJOON 1744 수 묶기  (0) 2019.09.15
[C++] BAEKJOON 1541 잃어버린 괄호  (0) 2019.09.14
[C++] BAEKJOON 1931회의실 배정  (0) 2019.09.14
Comments