본문 바로가기

Dot Algo∙ DS/PS

[BOJ] 백준 1188번 음식 평론가 (Java)

    #1188 음식 평론가

    난이도 : 골드 5

    유형 : 정수론 / GCD

     

    1188번: 음식 평론가

    첫째 줄에 소시지의 수 N과 평론가의 수 M이 주어진다. (1 ≤ N, M ≤ 100)

    www.acmicpc.net

    ▸ 문제

    선영이의 직업은 소시지 요리사이다. 소시지를 팔기 전에 음식 평론가 M명을 모아서 맛을 테스트해보려고 한다.

    선영이는 동일한 소시지를 총 N개를 준비했다. 이 소시지를 모든 평론가들이 같은 양을 받게 소시지를 자르려고 한다. 이때, 소시지를 자르는 횟수를 최소로 하려고 한다.

    예를 들어, 소시지가 2개, 평론가가 6명있는 경우를 생각해보자. 이때, 각 소시지를 세 조각으로 만든 다음, 각 평론가에게 한 조각씩 주면 된다. 이 경우에 소시지는 총 네 번 자르게 된다. 다른 경우로 소시지가 3개, 평론가가 4명 있는 경우를 생각해보자. 이때는 각 소시지의 크기를 3:1로 잘라서 큰 조각을 평론가에게 하나씩 주고, 남은 조각을 평론가에게 주면 모두 동일한 양을 받게 된다.

    소시지의 수와 평론가의 수가 주어졌을 때, 모든 평론가에게 같은 양의 소시지를 주기 위해 필요한 칼질의 수를 구하는 프로그램을 작성하시오. 

     입력

    첫째 줄에 소시지의 수 N과 평론가의 수 M이 주어진다. (1 ≤ N, M ≤ 100)

     출력

    첫째 줄에 모든 평론가에게 동일한 양을 주기 위해 필요한 칼질 횟수의 최솟값을 출력한다. 

     

    문제 풀이  

    평론가들은 N/M개의 소시지를 분배받는다. 만약 N/M=0이면 소시지를 자를 필요가 없다. 그러나 N/M != 0 이라면 같은 크기를 나눠갖게끔 잘라주면 된다. 만약 N=3, M=4 이라서 각 3/4 크기씩 줘야한다고 하면 소시지는 4-1만큼 잘라주면 된다.

     

    소시지가 N/M으로 나누어떨어지지 않으면 그냥 소시지가 GCD(N,M)개 있다고 생각하고 풀이를 하면 된다.

    • N=4, M=8이면  GCD(N,M)=4이다. 4개의 소시지에 각 2명씩 분배하면 된다. 따라서, 소시지 1개당 각 1/2씩 잘라야하므로 총 (2-1)번의 칼질이 필요하다. (m/gcd- 1)*gcd = (8/4-1)*4 = 4
    • N=3, M=12이면 GCD(N,M)=3이다.  3개의 소시지에 각 4명씩 분배하면 된다. 따라서, 소시지 1개 당 각 1/4씩 잘라야하므로 (4-1)번의 칼질이 필요하다. (m/gcd- 1)*gcd = (12/3-1)*3 = 12
    • N=4, M=6 이라면 GCD(N,M)=2이다. 2개의 소시지에 각 3명씩 분배하면 된다. 따라서, 소시지 1개 당 1/3개씩 잘라야하므로 (3-1)번의 칼질이 필요하다. (m/gcd- 1)*gcd = (6/2-1)*3 = 8

     

    따라서 (m/gcd -1)*gcd = m- gcd(n,m)을 구하면 필요한 칼질 횟수를 알 수 있다.

     

    풀이 코드

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    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());
    		
    		System.out.println(m-gcd(n,m));
    	}
    	
    	static int gcd(int a, int b) {
    		return a%b == 0 ? b: gcd(b, a%b);
    	}
    }