파이썬 알고리즘
[파이썬] 백준 13300 방배정 풀이
뜻 지, 깨달음 오
2022. 9. 25. 11:23
https://www.acmicpc.net/problem/13300
13300번: 방 배정
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 수학여행에 참가하는 학생 수를 나타내는 정수 N(1 ≤ N ≤ 1,000)과 한 방에 배정할 수 있는 최대 인원 수 K(1 < K ≤ 1,000)가 공백으로 분리되어
www.acmicpc.net
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))