본문 바로가기
백준

[백준] 2875번 : 대회 or 인턴 – JAVA [자바]

by Hongwoo 2022. 8. 7.
반응형

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

 

2875번: 대회 or 인턴

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

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 2875번 대회 or 인턴은 브론즈 3 난이도의 수학 및 구현 문제이다. 이 문제는 난이도의 비해 정답률이 낮다. 이 문제에서는 여학생 2명과 남학생 1명이 팀을 이뤄서 대회를 치른다. 그리고 여학생 N명, 남학생  M명이 주어진다. 그리고 이 대회에서는 K명이 무조건 인턴에 참여해야 한다. 그리고 인턴에 참여하는 학생은 대회를 치를 수 없다. 이때 대회에 참여하는 최대 팀의 개수를 출력하면 된다.

 

 이 문제는 처음에 되게 어려워 보일 수도 있다. 하지만 그렇게 어렵지 않으니 찬찬히 문제 풀이를 설명해 보도록 하겠다.

 

우선 인턴에 참여하는 학생들도 다 포함해서, 즉 k명을 빼기 전에 만들 수 있는 최대의 팀의 개수를 구한다. 이걸 int형 변수 team이라고 하겠다. 즉, team = Math.min (n / 2, m)이 된다.

 

team을 구하면 n에서 team을 만드는 데 사용한 여학생의 수, 즉 team × 2를 빼준다. 마찬가지로 m에서도 team을 만드는 데 사용한 남학생들을 빼준다. 따라서 n과 m은 다음과 같다.

n = n - team × 2

m = m - team

 

이렇게 하고 나면 가장 많은 팀을 이루고 남은 학생들의 수가 남는다. 그리고 여기서 인턴에 참여해야 하는 학생 수, k를 빼준다. 이 변수를 leftOver라고 하겠다. 즉, leftOver = n + m - k가 된다.

 

만약에 leftOver가 0 이상이면 인턴에 나가는 학생들을 다 빼고서도 가장 많은 팀을 만들었으므로 그대로 team을 출력하면 되다. 이제 leftOver가 음수인 경우를 살펴보겠다.

 

leftOver가 음수이면 team에서도 몇 명의 학생들을 빼줘야 한다는 말이다. 따라서 team에서 몇 개의 팀을 더 빼야 하는지를 구해보겠다. 이것은 leftOver를 3으로 나눈 값을 올림 한 값을 구해주면 된다. 이 변수를 minus라고 하겠다. 따라서 minus = Math.ceil(leftOver / 3)가 된다.

 

이제 team - minus를 한 값을 출력하면 되는데 team - minus가 음수이면 그냥 0을 출력하면 된다.

 

자세한 코드는 밑에서 참고할 수 있다.

 


  • 코드

 

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

public 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 = Math.min(n/2, m);  //인턴 나가는 학생들도 포함해서 만들 수 있는 최대 팀의 개수
        //최대 팀의 개수에 맞춰 학생 수를 빼준다
        m -= team;
        n -= 2*team;
        int leftOver = n+m-k;  // 남은 학생 수 - 인턴을 나가야 하는 학생 수
        // leftOver가 0 이상이면 문제 없으므로 그대로 팀의 개수를 출력
        if (leftOver >= 0) {
            System.out.print(team);
        } else {  // leftOver가 음수이면 
            leftOver = Math.abs(leftOver);
            int minus = (int)Math.ceil((double)leftOver / 3.0);
            if (team - minus >= 0) {
                System.out.print(team-minus);
            } else {
                System.out.print(0);
            }
        }
    }
}

 

 

반응형

댓글