파게로그
[백준 1188번] 음식 평론가 본문
문제 링크: 1188번 음식 평론가
https://www.acmicpc.net/problem/1188
풀이 과정보다, 풀이 과정을 떠올리는 과정을 먼저 설명해보면, 결국 어떻게 나누어지는지 실제로 몇 가지 예를 들어보는 편이 가장 빠른 것 같다. 적어도 민간인 머리를 가진 나에게는 말이다. 생긴 것부터 정수론 문제인 만큼, n > m일 때와 n < m일 때, 그리고 n % m == 0인지의 여부 등을 따져 몇 가지를 고려해보니 반례도 한 번에 고려할 수 있었다.
14라인
일단, 그냥 나누어주면 끝나는 경우에는 한 번도 자를 필요가 없다. 이는 빵이 사람의 배수인 것을 말하고, 물론 사람이 1명인 경우도 포함된다.
18라인
그리고 빵이 사람보다 많은 경우에는, 일단 나누지 않고 온전히 줄 수 있는 빵을 먼저 준 후에 빵을 나누어주면 된다.
22라인
이는 사람의 수가 빵의 개수의 배수인 경우이다.
빵이 5개, 사람이 20명인 경우를 생각해보자. 1명당 받아야 하는 빵의 양은 5/20 = 1/4이므로, 각 빵은 다음과 같이 나누어진다.
1번 빵: 1/4 1/4 1/4 1/4
2번 빵: 1/4 1/4 1/4 1/4
...
4번 빵: 1/4 1/4 1/4 1/4
→ 1인분이 5/20 = 4조각 → 칼질 4-1 = 3번
이를 조금 더 일반화해서 표현하면 아래와 같을 것이다.
빵이 pk개, 사람이 p개인 경우를 고려해보면, 1명 당 k만큼 받으면 된다. 곧, 각 빵마다 k등분해야하므로, 빵마다 칼질을 k-1번 한다.
27라인
서로소인 경우이다.
빵이 11개, 사람이 102명인 경우를 생각해보자. 1명당 받아야 하는 빵의 양은 11/102이므로, 각 빵은 다음과 같이 나누어진다.
01번 빵: 11/102 11/102 ... 11/102 3/102
02번 빵: 11/102 11/102 ... 11/102 3/102
...
20번 빵: 11/102 11/102 ... 11/102 3/102
→ 1인분이 11//102 = 9조각, 나머지 1조각 (총 9+1조각) → 칼질 9번
1인분짜리 조각은, n // m개 나온다. 하지만 m % n == 0인 위 경우와 달리, 나머지도 조각이 남는 것을 감안해야 한다.
import java.io.IOException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
System.out.println(get(n, m, 0));
}
static int get(int n, int m, int cnt) {
if (n % m == 0) {
return cnt;
}
if (n > m) {
return get(n % m, m, cnt);
}
if (m % n == 0) {
cnt += n * (m / n - 1);
return cnt;
}
cnt += n * (m / n);
m -= n * (m / n);
return get(n, m, cnt);
}
}
'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글
[백준 11049번] 행렬 곱셈 순서 (0) | 2022.03.17 |
---|---|
[백준 1520번] 내리막 길 (0) | 2022.03.16 |
[백준 1912, 1749번] 연속합, 점수따먹기 (0) | 2022.02.27 |
[백준 11066번] 파일 합치기 (0) | 2022.02.15 |
[백준 10775번] 공항 (0) | 2022.02.13 |