백준 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. 투숙객이 1명 이상인 날의 수
  2. 가장 많은 투숙객이 있었던 날에 투숙한 사람의 수
  3. 싸움이 없는 날의 수
  4. 싸움이 없는 날 중 가장 많은 투숙객이 있었던 날에 투숙한 사람의 수. 싸움이 없는 날이 없으면 0을 출력한다.
  5. 가장 오랜 기간 투숙한 사람이 투숙한 날의 수




풀이

# 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 23253 자료구조는 정말 최고야  (0) 2025.04.17
LeetCode 46 Permutations  (0) 2025.04.12
LeetCode 17 Letter Combinations of a Phone Number  (0) 2025.04.05
BOJ 27162 Yacht Dice  (0) 2025.03.30
BOJ 25204 문자열 정렬  (0) 2025.03.30