https://www.acmicpc.net/workbook/view/8399
참고
https://www.acmicpc.net/problem/13300
정보 초등학교에서는 단체로 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 | 2 | 입력 예시로 주어진 입력만 존재한다. |
2| 10 |1학년 남학생만 참가하는 것으로 가정한다.
3 |20 |1학년만 참가하는 것으로 가정한다.
4| 68 | 원래의 제약조건 이외에 아무 제약조건이 없다.
예제 입력
16 2
1 1
0 1
1 1
0 2
1 2
0 2
0 3
1 3
1 4
1 3
1 3
0 6
1 5
0 5
1 5
1 6
예제 출력
12
예제 입력
3 3
0 3
1 5
0 6
예제 출력
3
import sys
from math import ceil
read = sys.stdin.readline
N, K = map(int, read().split())
ans = [[0]*2 for _ in range(6)]
for i in range(N):
j, k = map(int, read().split())
ans[k-1][j] += 1
room = 0
for w, m in ans:
room += ceil(w/K) + ceil(m/K)
print(room)
6(학년)*2(성별)만큼의 2차원 리스트를 만들어 각 학년에 맞는 성별이 몇명인지 입력받는다.
for w, m in ans:
room += ceil(w/K) + ceil(m/K)
각 학년의 여학생, 남학생에 대해서 K명씩 모아 방을 만든다. 남은 인원끼리 한 방이 돼야하기 때문에 ceil()
을 이용했다.
(예를 들어 3명씩 짝지을 때 5명이면? -> 5/3=1.6666666...=2
총 두개의 방 필요)
쩝...분명히 같은 알고리즘인데 계속 틀렸다고 나왔었다.. 심지어 예제 입출력이 전부 같은데도?
내가 알아채지 못한 잔잔한 오류였겠지 뭐 어쨌든 코드길이 줄여서 만족함