Algorithm
[백준/BOJ] 23971번 ZOAC 4
SoyeonCha
2024. 10. 15. 12:38
언어 : C++
문제 링크 : https://www.acmicpc.net/problem/23971
문제
2021년 12월, 네 번째로 개최된 ZOAC의 오프닝을 맡은 성우는 오프라인 대회를 대비하여 강의실을 예약하려고 한다.
강의실에서 대회를 치르려면 거리두기 수칙을 지켜야 한다!
한 명씩 앉을 수 있는 테이블이 행마다 W개씩 H행에 걸쳐 있을 때, 모든 참가자는 세로로 N칸 또는 가로로 M칸 이상 비우고 앉아야 한다. 즉, 다른 모든 참가자와 세로줄 번호의 차가 N보다 크거나 가로줄 번호의 차가 M보다 큰 곳에만 앉을 수 있다.
논문과 과제에 시달리는 성우를 위해 강의실이 거리두기 수칙을 지키면서 최대 몇 명을 수용할 수 있는지 구해보자.
풀이
w를 (1+m)로 나눈 몫과 h를 (1+n)로 나눈 몫의 곱으로 구할 생각했음.
(C++에서 연산자 // 는 몫을 구할 때 사용되지 않음. 연산자 / 를 사용함.)
한 행에 테이블이 8개 있고, m이 2인 경우 3명이 앉을 수 있어야 되는데 이 방법으로 계산하면 몫이 (8 / (1+2) =)2로, 한 행에 2명만 앉을 수 있다는 결과가 나와버림. 그러므로 (1+m)으로 나눈 나머지가 1 이상이면 한 명 더 앉을 수 있는 것으로 처리해야 됨. if문으로 처리.
맞힌 코드
#include <stdio.h>
int main(void){
int h, w, n, m;
scanf("%d %d %d %d", &h, &w, &n, &m); // h,w,n,m 입력 받기
int a = w / (1 + m); // 한 행에 앉을 수 있는 사람 수
if (w % (1+m) > 0){ // (m+1)씩 테이블을 묶은 후 남은 자리가 있으면 한 명 더 앉히기
a += 1;
}
// 위와 같은 방법을 사용하여 한 열에서 사람을 앉힐 수 있는 행의 개수 구하기
int b = h / (1 + n);
if (h % (1+n) > 0){
b += 1;
}
printf("%d", a*b);
return 0;
}