[백준 8246] Stół (C#, C++) - soo:bak
작성일 :
문제 링크
설명
직사각형 테이블과 정사각형 의자가 주어질 때, 의자 등받이가 테이블 변과 겹치도록 배치할 수 있는 최대 개수를 구하는 문제입니다.
접근법
먼저 K가 A 또는 B보다 크면 의자 한 개도 들어가지 않으므로 0을 출력합니다.
다음으로 A 또는 B가 2K보다 작다면 그 방향으로는 의자 두 개가 겹치지 않게 놓일 수 없습니다. 이때는 긴 변을 따라 K씩 배치할 수 있는 개수인 max(A, B) / K가 최댓값입니다.
이후 두 변이 모두 2K 이상이면 네 변을 따라 배치할 수 있습니다. 각 변에 A / K, B / K개씩 놓되, 네 모서리는 서로 중복되므로 4개를 빼서 2*(A / K) + 2*(B / K) - 4를 사용합니다.
마지막으로 위 조건에 따라 값을 출력합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
class Program {
static void Main() {
var input = Console.ReadLine()!.Split();
var a = long.Parse(input[0]);
var b = long.Parse(input[1]);
var k = long.Parse(input[2]);
long ans;
if (k > a || k > b) ans = 0;
else if (a < 2 * k || b < 2 * k) ans = Math.Max(a, b) / k;
else ans = 2 * (a / k) + 2 * (b / k) - 4;
Console.WriteLine(ans);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll a, b, k;
if (!(cin >> a >> b >> k)) return 0;
ll ans;
if (k > a || k > b) ans = 0;
else if (a < 2 * k || b < 2 * k) ans = max(a, b) / k;
else ans = 2 * (a / k) + 2 * (b / k) - 4;
cout << ans << "\n";
return 0;
}