그리디 - 대회 or 인턴

LEE ·2022년 7월 27일
0

알고리즘 기출문제

목록 보기
46/60

백준 링크:https://www.acmicpc.net/problem/2875

문제 :

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

백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다. 대회에 참여하려는 학생들 중 K명은 반드시 인턴쉽 프로그램에 참여해야 한다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다.

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

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

입력
첫째 줄에 N, M, K가 순서대로 주어진다. (0 ≤ M ≤ 100, 0 ≤ N ≤ 100, 0 ≤ K ≤ M+N),

출력
만들 수 있는 팀의 최대 개수을 출력하면 된다.

문제를 풀기전 항상 생각해야 하는 것들 :
1. 어떤 알고리즘을 사용할 것인가 ?
2. 최대한 구체적으로 구상하기
3. java로 풀 경우 int 값을 벗어나는가 ?

1. 이 문제는 M과 N의 값이 작기 때문에 완전탐색으로 풀 수 있는 문제이다. 문제는 간단하지만 식을 도출하기가 힘든문제

2. 내가 생각한 방법은 먼저 팀을 최대로 만들고 팀을 만든나머지 인원을 k에서 빼준다 뺀값이 0보다 크다면 팀을 줄이며 k - 3 씩 해준다.

3. 벗어나지 않기 때문에 int 사용가능

구현코드 :

import java.io.*;
import java.util.*;

class Main{
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        int team = n / 2 >= m ? m : n / 2 ;
        int sum = (n - team * 2) + (m - team);
        k -= sum;
        while(k > 0){
            k -= 3;
            team--;
        }
        System.out.println(team);
        
    }
}

문제를 오랜만에 풀어서 시간이 오래걸렸던거 같다. 전체에서 k 를 빼주고 하는 방법도 있겠지만, 팀을 최대로 만들 수 있는 방법을 선택하다 보니 먼저 팀을 최대로 만들고 k를 빼는 방법을 선택한거 같다.

0개의 댓글

관련 채용 정보