Mini

백준 13300 방배정 cpp // visited배열활용 , 몇 묶음인지 구현하는법 본문

Algorithm/배열

백준 13300 방배정 cpp // visited배열활용 , 몇 묶음인지 구현하는법

Mini_96 2023. 8. 16. 15:33

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

 

13300번: 방 배정

표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 수학여행에 참가하는 학생 수를 나타내는 정수 N(1 ≤ N ≤ 1,000)과 한 방에 배정할 수 있는 최대 인원 수 K(1 < K ≤ 1,000)가 공백으로 분리되어

www.acmicpc.net

*의사코드

1. visiited에 [학년][성별]이 몇명인지 기록.

for visitied : 학년별 성별인 사람숫자에서 각각 몇묶음인지 카운팅하면된다.

ex) 6학년 남학생 : 7명 / k=3 

3묶음(3+3+1) == 필요한 방의 갯수

 

* 몇 묶음인지 구현하는법 (뺄셈을 이용하면 된다.)

int people = visited[i][j];
while (people / k != 0) {
    people = people - k;
    ret1++;
}
if (people % k != 0){
    ret1++;;
}

//7명, k=3
//4명
//1명

 

* 몇 묶음인지 구현하는법2

출처 : 바킹독 github (basic-algo-lecture-master/workbook/0x03.md)

1. 몫만큼 카운팅

2.나머지가 존재할경우 카운팅+1

이방법이 훨씬 깔끔하다.....

// 필요한 방의 개수 계산
  for (int i=0; i<2; ++i) {
    for (int j=1; j<7; ++j) {
      // 배정에 필요한 만큼 방의 개수 추가
      ans += s[i][j] / K;
      // 학생이 남을 경우, 하나의 방이 더 필요하므로 방의 개수 추가
      if (s[i][j] % K) ++ans;
    }
  }

 

#include<bits/stdc++.h>
using namespace std;

int n,k,visited[7][2],ret1,ret2,ret3,ret4;
// [학년1-6][성별 / 여:0 / 남:1]

int main() {
	cin >> n>>k;
	for (int i = 0; i < n; ++i) {
		int a, b = 0;
		cin >> a >> b;	//성별,학년
		visited[b][a]++;
	}
	
	for (int i = 1; i <= 6; ++i) {
		for (int j = 0; j <= 1; j++) {
			int people = visited[i][j];
			while (people / k != 0) {
				people = people - k;
				ret1++;
			}
			if (people % k != 0){
				ret1++;;
			}

			//7명, k=3
			//4명
			//1명
		}
	}

	cout << ret1;
}