아레나레이팅

solved.ac Grand Arena #3

이 문제에서는 각 사이즈별로 구매할 티셔츠 묶음 수와, 구매할 펜 묶음 수를 구해야합니다. 우선, 간단한 펜 묶음의 수 부터 구해봅시다.

펜 묶음을 몇 개 주문할지 구하기 위해서는, NN개의 펜을 PP개 단위로 묶어야합니다. 나눗셈을 사용하면, NNPP로 나눈 몫 qq와 나머지 rr을 구할 수 있습니다. 수식으로는 N÷P=qrN \div P = q \cdots r으로 표현합니다. 이는 펜을 PP개씩 묶으면 qq개가 묶이고, rr개가 남는다는 뜻입니다. 이 q,rq, r이 펜을 주문해야하는 묶음 수와, 주문 후 펜을 한 자루씩 주문해야하는 수입니다.

티셔츠

풀이 1

이제 S사이즈의 티셔츠를 몇 묶음 구매해야 하는지 계산합시다.

SS 사이즈의 티셔츠를 TT장 단위로 묶기 위해서 나눗셈을 씁니다. SSTT로 나눈 몫과 나머지를 각각 q,rq, r라고 표현합시다. (S÷T=qr)(S \div T = q \cdots r)

각각의 언어로는 다음과 같이 구현할 수 있습니다. 변수명은 각각 S, T 이고 결과는 res 입니다.

C++

int q = S / T, r = S % T; int res = q + (r > 0 ? 1 : 0);

Python

q, r = S // T, S % T res = q + (1 if r > 0 else 0)

Rust

let q = S / T; let r = S % T; let res = q + if r > 0 { 1 } else { 0 };

풀이 2

if 문을 사용하지 않고도 코드를 작성할 수 있습니다. 우선, 다음과 같은 기호를 쓰겠습니다.

우리가 정수 나눗셈에서 구하는 SSTT로 나눈 몫은, ST\left\lfloor \frac{S}{T} \right \rfloor입니다. SSTT로 나눈 후에, TT개씩 묶지 못하는 소수 부분을 없애줍니다. 하지만, 이 문제에서 구해야 할 것은 ST\left \lceil \frac{S}{T} \right \rceil입니다. 소수부분이 남더라도, 그 부분을 11개의 묶음으로 생각해줘야합니다.

이제, 다음을 증명합시다. 00 이상인 정수 SS와, 11 이상인 정수 TT에 대해, ST=S+T1T\left\lceil \frac{S}{T} \right\rceil = \left\lfloor \frac{S+T-1}{T} \right\rfloor입니다.

이를 이용하면 좀 더 간단하게 코드를 작성할 수 있습니다. 아래는 각 언어로 작성된 모범답안입니다.

코드 (C++)

#include <iostream> #include <vector> using namespace std; int main() { int N; cin >> N; vector<int> sizes(6); for (int &size : sizes) cin >> size; int T, P; cin >> T >> P; int sumv = 0; for (int size : sizes) sumv += (size + T - 1) / T; cout << sumv << endl; cout << N / P << " " << N % P << endl; }

코드 (Python)

def main(): N = int(input()) sizes = list(map(int, input().split())) T, P = map(int, input().split()) print(sum((size + T - 1) // T for size in sizes)) print(N // P, N % P) if __name__ == '__main__': main()

코드 (Rust)

use std::io::*; fn main() { let n = read_vec()[0]; let sizes = read_vec(); let (t, p) = { let v = read_vec(); (v[0], v[1]) }; println!("{}", sizes.iter().map(|x| (x + t - 1) / t).sum::<u32>()); println!("{} {}", n / p, n % p); } fn read_vec() -> Vec<u32> { let mut s = String::new(); stdin().read_line(&mut s).unwrap(); s.split_whitespace().map(|x| x.parse().unwrap()).collect() }