문제
정보 초등학교에서는 단체로 2박 3일 수학여행을 가기로 했다. 여러 학년이 같은 장소로 수학여행을 가려고 하는데 1학년부터 6학년까지 학생들이 묵을 방을 배정해야 한다. 남학생은 남학생끼리, 여학생은 여학생끼리 방을 배정해야 한다. 또한 한 방에는 같은 학년의 학생들을 배정해야 한다. 물론 한 방에 한 명만 배정하는 것도 가능하다.
한 방에 배정할 수 있는 최대 인원 수 K가 주어졌을 때, 조건에 맞게 모든 학생을 배정하기 위해 필요한 방의 최소 개수를 구하는 프로그램을 작성하시오.
예를 들어, 수학여행을 가는 학생이 다음과 같고 K = 2일 때 12개의 방이 필요하다. 왜냐하면 3학년 남학생을 배정하기 위해 방 두 개가 필요하고 4학년 여학생에는 방을 배정하지 않아도 되기 때문이다.
학년 | 여학생 | 남학생 |
1학년 | 영희 | 동호, 동진 |
2학년 | 혜진, 상희 | 경수 |
3학년 | 경희 | 동수, 상철, 칠복 |
4학년 | 달호 | |
5학년 | 정숙 | 호동, 건우 |
6학년 | 수지 | 동건 |
입력
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 수학여행에 참가하는 학생 수를 나타내는 정수 N(1 ≤ N ≤ 1,000)과 한 방에 배정할 수 있는 최대 인원 수 K(1 < K ≤ 1,000)가 공백으로 분리되어 주어진다. 다음 N 개의 각 줄에는 학생의 성별 S와 학년 Y(1 ≤ Y ≤ 6)가 공백으로 분리되어 주어진다. 성별 S는 0, 1중 하나로서 여학생인 경우에 0, 남학생인 경우에 1로 나타낸다.
출력
표준 출력으로 학생들을 모두 배정하기 위해 필요한 최소한의 방의 수를 출력한다.
풀이
/*
* 1. 학생 수 N 한 방에 배정할 수 있는 최대 인원 수 K
* 2. 학생의 성별 S(여 0 남 1) 학년 Y(1~6)
* 3. 출력: 최소한의 방 개수
* 4. 같은 성별, 같은 학년과 함께 방 배정
*
* >> [2][6] 2차원 배열 만들어서 값 넣기
*/
처음 짰던 코드에서 테스트 케이스를 전부 통과했음에도 2점밖에 받지 못했다 그 외에 여러 경우를 해봤지만 전부 잘 돌아가서 뭐가 문제인가 싶었는데 방을 나누는 과정에서 틀린 게 있었다
1. 성별/학생에 맞춰 배열 >> student[2][6]
2. 학생들을 해당 인덱스에 맞춰 분류한다 >> student[성별][학년-1] 학년은 1~6이고 배열은 0~5이기 때문에 학년에 -1을 해 준다
3. 한 방에 K명이 넘어가면 학생 수를 K로 나누어 방을 추가해 준다 >> room += student[성별][학년] / K;
>> 이 과정에서 문제가 생겼는데, 예를 들어 11명이 있는데 한 방 최대 인원이 5명이라면 5, 5, 1로 나누어 11/5 = 2개의 방을 추가하는 게 맞다. 하지만 10명이 있다면 5, 5로 나누어 10/5 = 2개의 방을 추가하는 게 아닌 1개의 방만 추가해야 한다.
4. 한 방에 있는 학생 수가 최대 인원의 배수라면(나머지가 없다면) 방 하나를 뺀다 >> if(student[i][j]%K==0) room--;
코드
package im형필수문제;
import java.util.*;
import java.io.*;
public class b2_13300_방배정 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[][] student = new int[2][6];
int room = 0;
for(int n = 0; n < N; n++) {
st = new StringTokenizer(br.readLine());
int S = Integer.parseInt(st.nextToken());
int Y = Integer.parseInt(st.nextToken());
student[S][Y-1] += 1; //학생들을 그룹으로 나눔
}
for(int i = 0; i<2; i++) {
for(int j = 0; j<6; j++) {
if(student[i][j]!=0) room++;
if(student[i][j]>K) { //한 방에 K명이 넘어가면
room += student[i][j] / K; //해당 인원수를 K명으로 나눠 방 배정(나머지 있는 것까지 고려)
if(student[i][j]%K==0) room--; //해당 학생이 최대 인원의 배수일 경우 방 하나를 빼야 함(나머지가 없기 때문)
}
}
}
System.out.println(room);
}
}
결과
#자바 #java #boj #백준 #알고리즘
'알고리즘 > BOJ' 카테고리의 다른 글
[java][boj][s4] 2108. 통계학 (0) | 2022.02.13 |
---|---|
[java][boj][b1] 14696. 딱지놀이 (0) | 2022.02.13 |
[java][boj][b1] 10163. 색종이 (0) | 2022.02.13 |
[java][boj][b1] 2669. 직사각형 네개의 합집합의 면적 구하기 (0) | 2022.02.13 |
[java][boj][s5] 2635. 수 이어가기 (0) | 2022.02.12 |