[BOJ/13300/C++] 방 배정

SHark·2023년 3월 3일
0

BOJ

목록 보기
10/59

출처 : https://www.acmicpc.net/problem/13300

문제

여러 학년이 같은 장소로 수학여행을 가려고 하는데 1학년부터 6학년까지 학생들이 묵을 방을 배정해야 한다. 한 방에 배정할 수 있는 최대 인원 수 K가 주어졌을 때, 조건에 맞게 모든 학생을 배정하기 위해 필요한 방의 최소 개수를 구하는 프로그램을 작성하시오.

문제조건

  • 남학생은 남학생끼리, 여학생은 여학생끼리 방을 배정해야 한다.
  • 또한 한 방에는 같은 학년의 학생들을 배정해야 한다.
  • 물론 한 방에 한 명만 배정하는 것도 가능하다.

입출력조건

  • 첫 번째 줄에는 수학여행에 참가하는 학생 수를 나타내는 정수 N(1 ≤ N ≤ 1,000)과 한 방에 배정할 수 있는 최대 인원 수 K(1 < K ≤ 1,000)가 공백으로 분리되어 주어진다.
  • 다음 N 개의 각 줄에는 학생의 성별 S와 학년 Y(1 ≤ Y ≤ 6)가 공백으로 분리되어 주어진다.
  • 성별 S는 0, 1중 하나로서 여학생인 경우에 0, 남학생인 경우에 1로 나타낸다.

SOL

여성,남성끼리 따로 모아놓고 각 학년별로 배열에 담아놓으면 된다. 1학년 -> 1번 인덱스, 2학년 ->2번 인덱스와 같이하고, 방 개수를 계산해주면 된다. 방의 개수를 계산하는 방법은 아래처럼 풀었다. 정원이 K명일때 , {전체인원수 + (K-1)} / K 를 하게되면 방의 갯수가 나온다.

예를들어, 정원이 6명인 방이 있고, 전체 9명이 있다면, 방은 2개가 하다는게 직관적으로 구할 수 있다. 이는 올림수를 이용할 수도 있지만(1.xxx가 나온다면, 2로 취급), 나눗셈의 성질을 이용할 수 있다. 전체인원 수 + (K-1)을 해준다는 의미 K명으로 나눌 때 , 나머지가 있다면 몫을 +1해주겠다는 의미이다.

#include <bits/stdc++.h>
using namespace std;
int main()
{
  ios::sync_with_stdio(0);
  cin.tie(0);
  int girls[7] = {};
  int boys[7] = {};
  int N, K;
  int Gender, Grade, Rooms = 0;
  cin >> N >> K;

  for (int i = 0; i < N; i++)
  {
    cin >> Gender >> Grade;
    if (Gender)
    {
      boys[Grade]++;
      continue;
    }
    girls[Grade]++;
  }
  for (int i = 1; i < 8; i++)
  {
    Rooms += (boys[i] + (K - 1)) / K;
    Rooms += (girls[i] + (K - 1)) / K;
  }
  cout << Rooms << '\n';
  return 0;
}

0개의 댓글