-- 예전 기록/BOJ

[ BOJ ] 29720 : 그래서 님 푼 문제 수가? ( BRONZE 3 ) / C, Python

rejo 2023. 10. 3. 10:50

문제

브실이는 하루라도 빨리 대회 출제 자격을 얻기 위해서 1000문제 해결을 목표로 매일 문제를 풀고 있다. 그러다 보니 다른 사람들의 푼 문제 수에 관심이 많다. 사람들은 “저는 총 1000문제 이상 해결하려면 하루에 5문제씩 최소 128일은 더 풀어야 해요”와 같이 자신이 몇 문제를 풀었는지 설명한다. 브실이는 이 말을 들을 때마다 상대방이 현재까지 몇 문제를 풀었는지 궁금해서 참을 수 없었다.

브실이를 도와 상대방이 푼 문제 수의 최솟값과 최댓값을 구해보자.

입력

첫 번째 줄에 양의 정수 가 공백으로 구분되어 주어진다. (1 ≤ N, M, K ≤ 2000)

이는 “저는 총 문제 이상 해결하려면 하루에 문제씩 최소 일은 더 풀어야 해요”라는 의미이다.

일이 지나기 전에 문제를 해결할 수 있는 입력은 주어지지 않는다.

출력

위 문장으로 알 수 있는 상대방이 현재까지 푼 문제 수의 최솟값과 최댓값을 공백으로 구분하여 한 줄에 순서대로 출력한다.

풀이 과정

총 N문제 이상 해결하기 위해, 하루에 M문제씩 최소 K일은 더 풀어야 한다면,

풀어야 하는 문제의 최솟값은 M * (K - 1) + 1 문제이다. (M문제씩 (K-1)일 풀고, 마지막에 1문제 더 풀면 끝)

풀어야 하는 문제의 최댓값은 M * K 문제이다. (M문제씩 K일을 더 풀어서 딱 N 문제 맞추기)

 

이를 이용하여 현재까지 푼 문제 수의 최솟값과 최댓값을 구할 수 있다.

현재까지 푼 문제 수의 최솟값은 N - ( 풀어야 하는 문제의 최댓값 ) 이고, ( N - (M * K) )

현재까지 푼 문제 수의 최댓값은 N - ( 풀어야 하는 문제의 최솟값 ) 이다. ( N - (M * (K - 1) + 1 )

 

만약 이렇게 계산한 현재까지 푼 문제 수의 최솟값, 최댓값이 음수라면,

아무 문제도 안 풀었다는 뜻이니 0을 출력한다.

C

#include <stdio.h>

int main(void) {
    int n, m, k;
    scanf("%d %d %d", &n, &m, &k);

    int min = n - (m * k);
    int max = n - (m * (k - 1) + 1);
    
    if (min < 0) printf("0 ");
    else printf("%d ", min);
    if (max < 0) printf("0 ");
    else printf("%d ", max);

    return 0;
}

Python

n, m, k = map(int, input().split())
print(max(n - (m * k), 0), max(n - (m * (k - 1) + 1), 0))