
백준 BOJ 16961 탭 vs 공백 문제의 파이썬 python 풀이입니다.
https://www.acmicpc.net/problem/16961
문제
큐브러버가 운영하는 호텔은 1년 스케줄을 전년도에 미리 정해놓는다. 또, 이 호텔에는 코딩을 할 줄 아는 사람만 투숙할 수 있다. 코딩을 할 때 들여쓰기는 필수이다. 호텔에는 두 종류의 사람이 투숙하는데, 들여쓰기로 탭을 사용하는 사람과 공백을 사용하는 사람이다. 편의를 위해 각각 "탭파"와 "공백파"로 부르도록 하자.
올해는 윤년이기 때문에, 총 366일로 이루어져 있다. 편의상 날짜는 1일-366일로 표시한다.
큐브러버의 호텔에 예약을 한 사람의 수는 N명이고, 각 사람이 투숙 시작일과 종료일을 모두 알고 있다. 모든 사람은 투숙 시작일의 오전 9시에 호텔에 투숙하고, 투숙 종료일의 오후 6시에 호텔에서 나간다. 이 호텔에는 모든 것이 있기 때문에, 호텔 투숙객은 호텔을 벗어나지 않는다.
탭파와 공백파가 만나면 싸운다. 하지만, 탭파와 공백파의 수가 일치하는 날에는 균형이 잡혀서 싸움이 일어나지 않는다. 탭파가 한 명도 없거나 공백파가 한 명도 없으면 호텔 관리자들끼리 왜 호텔 운영을 이런 식으로 하냐며 서로 책임을 돌리면서 싸운다.
호텔 예약 정보가 주어졌을 때, 여러가지 정보를 구해보려고 한다.
입력
첫째 줄에 예약을 한 사람의 수 N(1 ≤ N ≤ 5,000)이 주어진다. 둘째 줄부터 호텔 예약 정보가 한 줄에 하나씩 주어진다.
호텔 예약 정보는 문자 c와 정수 s, e로 이루어져 있다. c가 'T'인 경우는 탭파, 'S'인 경우는 공백파이다. s는 투숙 시작일, e는 투숙 종료일이다. (1 ≤ s ≤ e ≤ 366)
출력
다음 정보를 한 줄에 하나씩 출력한다.
- 투숙객이 1명 이상인 날의 수
- 가장 많은 투숙객이 있었던 날에 투숙한 사람의 수
- 싸움이 없는 날의 수
- 싸움이 없는 날 중 가장 많은 투숙객이 있었던 날에 투숙한 사람의 수. 싸움이 없는 날이 없으면 0을 출력한다.
- 가장 오랜 기간 투숙한 사람이 투숙한 날의 수
풀이
# 16961 탭 vs 공백
import sys
n = int(sys.stdin.readline().strip()) # 예약한 사람의 수
# 각 날짜별 탭파와 공백파의 수를 기록할 배열 (1일부터 366일까지)
tab = [0] * 367
space = [0] * 367
# 투숙 기간 기록
max_stay = 0
# 모든 예약 정보 처리
for _ in range(n):
c, s, e = input().split()
s, e = int(s), int(e)
# 가장 오랜 기간 투숙한 사람 업데이트
max_stay = max(max_stay, e - s + 1)
# 해당 손님의 투숙 날짜 기록
if c == 'T': # 탭파
for day in range(s, e + 1):
tab[day] += 1
else: # 공백파
for day in range(s, e + 1):
space[day] += 1
# 결과 계산
one_over = 0 # 투숙객이 1명 이상인 날의 수
max_guests = 0 # 가장 많은 투숙객이 있었던 날의 투숙객 수
no_fight = 0 # 싸움이 없는 날의 수
no_fight_max = 0 # 싸움이 없는 날 중 가장 많은 투숙객이 있었던 날의 투숙객 수
for day in range(1, 367):
total_guests = tab[day] + space[day]
# 투숙객이 있는 날 카운트
if total_guests > 0:
one_over += 1
# 최대 투숙객 수 업데이트
if total_guests > max_guests:
max_guests = total_guests
# 싸움이 없는 날 체크 (탭파 == 공백파 && 둘 다 0이 아닌 경우)
if (tab[day] == space[day]) and (tab[day] > 0):
no_fight += 1
# 싸움이 없는 날 중 최대 투숙객 수 업데이트
if total_guests > no_fight_max:
no_fight_max = total_guests
# 결과 출력
print(one_over)
print(max_guests)
print(no_fight)
print(no_fight_max)
print(max_stay)
- 입력 처리
- 예약한 사람의 수 N을 입력
- 각 예약 정보(탭파/공백파, 투숙 시작일, 종료일)를 입력
- 날짜별 투숙객 추적
- 1일부터 366일까지 각 날짜별로 탭파와 공백파의 수를 기록
- 각 예약마다 투숙 시작일부터 종료일까지 해당 유형의 손님 수를 증가시킴
- 통계 계산
- 투숙객이 1명 이상인 날의 수를 계산
- 가장 많은 투숙객이 있었던 날의 투숙객 수를 찾음
- 싸움이 없는 날(탭파와 공백파의 수가 동일하고 둘 다 0이 아닌 경우)의 수를 계산
- 싸움이 없는 날 중 가장 많은 투숙객이 있었던 날의 투숙객 수를 찾음
- 가장 오랜 기간 투숙한 사람의 투숙 일수를 계산
'Algorithm > Python' 카테고리의 다른 글
BOJ 27162 Yacht Dice (0) | 2025.03.30 |
---|---|
BOJ 25204 문자열 정렬 (0) | 2025.03.30 |