백준 2875 - 대회 or 인턴


1. 문제 정리
  - 팀을 결성하는 데는 2명의 여학생과 1명의 남학생이 필요하다(2:1)

  - N명의 여학생과 M명의 남학생 중(N+M명의 학생 중) K명은 인턴쉽 프로그램에 참여해야하며, 이 K명은 대회에 참여하지 못한다.

  - 위 조건으로 만들 수 있는 최대 팀 수는?(최대 여학생 - 남학생 조합은?)
 
2. 접근
  - 여학생과 남학생의 합이 K 이상인 동안 N에서는 2, M에서는 1씩 빼나가 팀 수를 늘려나간다.
 
3. 풀이

#include<iostream>
using namespace std;

int n, m, k;

int main(){
    cin >> n >> m >> k;
    int sum = 0;
    while(n+m >= k){
        if(n < 2 || m < 1) break;
        sum += 1;
        n -= 2;
        m -= 1;
        if(n+m < k) {
            n += 2; m += 1; sum -= 1;
            break;
        }
    }
    cout << sum;
}


  - while loop에서 n이 2보다 작거나, m이 1보다 작을 때, 반복문을 탈출한다.(더 이상 팀을 만들 수 없다.) 그러지 않을 경우 팀의 수를 1 늘리고 n을 2, m을 1 줄인다. 그 후 남은 n과 m의 합이 k 보다 작아질 경우(인턴쉽 프로그램에 k명의 학생을 참여시키지 못할 때) n, m, sum(팀의 수) 값을 이전 상태로 복원키고 반복문을 탈출한다.

 
4. 소감

  난이도 자체도 낮은 문제였어서 안일하게 풀었던 문제인 것은 분명하다. 그럼에도 크게 어려운 부분은 없었고 오히려 내가 뭘 빠트리지는 않았나 라는 생각을 했다. 좀 더 코드를 간결하고 깔끔하게 짤 수 있으면 좋을텐데 라는 생각을 하게 만드는 문제였다.

  문제는 오히려 빠르게 풀고, 정답도 한번에 맞췄지만 코드가 지저분해 보인다거나... 좀 더 깔끔한 알고리즘은 없었을까 고민하게 만드는 문제였다.

'study > coding test' 카테고리의 다른 글

백준 1783 - 병든 나이트  (0) 2021.12.15
백준 10610 - 30  (0) 2021.12.14
백준 11047 - 동전0  (0) 2021.12.13
백준 11662 - 민호와 강호  (0) 2021.12.10
백준 10816 - 숫자 카드 2  (0) 2021.12.09

댓글