https://www.acmicpc.net/problem/13300
2차원 버켓을 활용한 문제는 처음이었던 것 같다.
그 생각만 했으면 시간을 훨씬 더 단축했을텐데....!!
일단 input을 다 받아오고,
y축은 성별, x축은 학년별 분류가 되게끔 bucket을 만들었다.
0학년은 없으니까 x축 길이에 유의하기~!
student_total, room_total = map(int, input().split())
students = [list(map(int, input().split())) for _ in range(student_total)]
bucket = [[0]*7 for _ in range(2)]
for i in range(len(students)):
bucket[students[i][0]][students[i][1]] += 1
한명씩 담아주면 된다.
이제 이들이 들어갈 방에 대해서 생각을 해봐야하는데,
1) 해당 성별&학년 학생이 없으면(인원수가 0이면) 방배정이 안된다.
2) 한 방의 최대수용인원보다 작으면, 자리가 남아도 방 하나를 배정해준다.
3) 한 방의 최대수용인원보다 크면 두가지경우로 나뉜다
4) 인원수가 최대수용인원의 k배이면, k개의 방을 배정한다.
5) 인원수가 k배 하고도 남는 인원이 있으면, 그 나머지 인원한테 +1 방을 배정해줘야 한다.
room_number = 0
for i in range(2):
for j in range(7):
if bucket[i][j] ==0:
continue
elif 0<bucket[i][j]<room_total:
room_number +=1
elif bucket[i][j]%room_total==0:
room_number += bucket[i][j]/room_total
elif bucket[i][j]%room_total!=0:
room_number += (bucket[i][j]//room_total)+1
내가 말한 조건들을 모두 코드에 구현하면 이렇게 된다.
이제 print만 하면 된다.
근데 결과 반환이 float로 되는 경우가 있어서 이를 int로 다시 반환해준다.
print(int(room_number))
끝~
2차원 bucket만 생각했다면 soso 쉬운문제
전체 풀이)
student_total, room_total = map(int, input().split())
students = [list(map(int, input().split())) for _ in range(student_total)]
bucket = [[0]*7 for _ in range(2)]
for i in range(len(students)):
bucket[students[i][0]][students[i][1]] += 1
room_number = 0
for i in range(2):
for j in range(7):
if bucket[i][j] ==0:
continue
elif 0<bucket[i][j]<room_total:
room_number +=1
elif bucket[i][j]%room_total==0:
room_number += bucket[i][j]/room_total
elif bucket[i][j]%room_total!=0:
room_number += (bucket[i][j]//room_total)+1
print(int(room_number))
'파이썬 알고리즘' 카테고리의 다른 글
[파이썬] 13748 진기의 최고급 붕어빵 (1) | 2022.10.01 |
---|---|
[파이썬] 백준 2309 일곱 난쟁이 풀이 2가지 (1) | 2022.09.30 |
백준 1244 스위치 켜고 끄기 파이썬 풀이 (1) | 2022.09.24 |
백준 10157 자리배정 파이썬 풀이 (1) | 2022.09.23 |
백준 2628 종이자르기 파이썬 풀이 (0) | 2022.09.22 |