패스트터틀

(Baekjoon) GreedyAlgorithm - (7) 대회 or 인턴 본문

Algorithm/baekjoon

(Baekjoon) GreedyAlgorithm - (7) 대회 or 인턴

SudekY 2019. 11. 7. 16:40

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

 

2875번: 대회 or 인턴

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

www.acmicpc.net

다음과 같이 나누어서 생각한다.

본인은 이거 풀다가 코딩실수가 많이 나와서 5번이나 틀렸다. ㅋㅋ

 

경우의수 1:

ex) 47 23 3
여학생 23팀
남학생 23팀
if(여학생팀 == 남학생팀)
남은학생 : 여학생 % 2;
경우의수 2:
ex) 47 26 3
여학생 23팀
남학생 26팀
if(남학생팀 > 여학생팀)
여학생기준 23개의팀 생성가능
남은학생 : 남학생팀 - 여학생팀 후에 여학생 % 2 를 더하기
경우의수 3:
ex) 63 10 3
여학생 31팀
남학생 10팀
if(여학생팀 > 남학생팀)
남학생기준 10개의팀 생성가능
남은학생 : (여학생팀 - 남학생팀)*2 후에 + 여학생 % 2 를 더하기 
--------------------------------------------------------------------------


남은학생이 K랑 같거나 클경우
if(남은학생 >= K))
정답 : 팀
남은학생이 K보다 작을경우
if( 남은학생 < K)
K에서 남은학생을 빼고
K -= 남은학생
K2 = K의 값을 3으로 나누기 + 1   // 계산의 영향을 받지 않게 하기위해 K2를 새로넣었으며 
if(K % 3 == 0 ) K2--;                // 남은 K의값이 1에서 3이하일경우 1개의팀이 파괴되고하고
정답 : 팀 -= K                          //  남은 K의값이 4에서 6이하일경우 2개의팀이 파괴되는식으로 따졌을때
                                            //  123 456 789 101112 ..

                                            //  001 112 223   3 3  4 (3으로 나누었을경우)

                                            //     1    2    3   4        ( 001은 1개의팀 112는 2개의팀이 파괴되야하니까)

                                            //  나누기 3을 시행하고 +1을 시행해준후 % 3 == 0 일때는 -1을 한번더 빼준다.
*/

 

package GreedyAlgorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class _2875 {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int NMK[] = new int[]{Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken())};
   
        int Team;
        int remain;
        if( (NMK[0]/2) == NMK[1]){
            Team = NMK[1];
            remain = NMK[0] % 2;
        }
        else if( NMK[1] > (NMK[0]/2)  ){
            Team = NMK[0]/2;
            remain = (NMK[1] - (NMK[0]/2)) + (NMK[0] % 2);
        }
        else{
            Team = NMK[1];
            remain = (  (NMK[0]/2) - NMK[1])*2 + (NMK[0] % 2);
        }

        if (remain >= NMK[2]){
            System.out.println(Team);
        }
        else{
            int K = 0;
            NMK[2] = NMK[2] - remain;
            K = (NMK[2] / 3) + 1;
            if( NMK[2] % 3 == 0) K--;
            System.out.println(Team - K);
        }

        

    }
}

 

다음은 내가 위와 같이 짠 if문을 while문으로 간단하게 짠코드이다.

나도 저런식으로 생각을했어야 했는데 너무 if문을 많이 써버렸다.

 

컴퓨터가 반복계산에 능하다는것을 유의하며 반복문을 잘 활용해야한다는걸 배운다.

if문은 반복문중에 있으면 충분하다.

 

 

 

출처 : https://pledge.tistory.com/entry/%EB%B0%B1%EC%A4%802875-%EB%8C%80%ED%9A%8C-or-%EC%9D%B8%ED%84%B4

 

백준)2875-대회 or 인턴

문제 링크 https://www.acmicpc.net/problem/2875 2875번: 대회 or 인턴 문제 백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보..

pledge.tistory.com

 

 

 

 

 

백준문제풀이Github : 

https://github.com/sdk0213/baekjoon-study

 

sdk0213/baekjoon-study

solve a baekjoon question. Contribute to sdk0213/baekjoon-study development by creating an account on GitHub.

github.com

 

Comments