6485. 삼성시의 버스 노선

Sarah·2021년 8월 24일
0

SWE

목록 보기
2/19

출처 : SW Expert Academy

문제

삼성시 버스 : 1에서 5,000까지 번호가 붙어 있다.

버스 노선 : N개
i번째 버스 노선 : 번호가 Ai이상 Bi이하인 모든 정류장만을 다니는 버스

=> P개의 버스 정류장에 대해 각 정류장에 몇 개의 버스 노선이 다니는지 구하는 프로그램을 작성하라.

[입력]

첫 번째 줄 : 테스트 케이스의 수 = T

각 테스트 케이스의 첫 번째 줄 : N ( 1 ≤ N ≤ 500 )

N개의 줄의 i번째 줄 : Ai, Bi ( 1 ≤ Ai ≤ Bi ≤ 5,000 )

다음 줄 : 하나의 정수 P ( 1 ≤ P ≤ 500 )

다음 P개의 줄의 j번째 줄 : Cj ( 1 ≤ Cj ≤ 5,000 )

[출력]
ex)
#1 1 2 2 1 1 //첫 번째 테스트 케이스 결과

'#케이스번호 P개의 정수(Cj번 버스 정류장을 지나는 버스 노선의 개수)'

# 0824
import sys
sys.stdin = open('input.txt')

T = int(input())

def bus_cnt(bus_stop):
    cnt = 0

    for i in range(N):
        if bus[i][0] <= bus_stop <= bus[i][1]:
            cnt += 1
    return cnt


for tc in range(1, T+1):
    N = int(input()) # 버스 노선 수
    # 버스 다니는 정류장 (시작점, 끝점)
    bus = [list(map(int, input().split())) for _ in range(N)]
    # 확인 정류장 수
    P = int(input())
    # 정류장마다 지나는 버스 갯수 저장리스트
    result = []

    for i in range(P):
        bus_stop = int(input())
        result.append(bus_cnt(bus_stop))
        # 주석 1!


    print('#{}'.format(tc), end=' ')
    print(*result)

장애물 1.

문제점

# runtime error 
    result = [0] * (P+1)
    for i in bus:
        for j in range(i[0],i[1]+1):
            result[j] += 1
    print('#{}'.format(tc), end=' ')
    print(*result[1:])

버스 노선의 정류장들을 모두 반복하며 result에 값을 넣었다.
-> 런타임오류 + 장애물2와 같이 다른케이스 적용 안됌

해결법

def bus_cnt(bus_stop):
    cnt = 0

    for i in range(N):
        if bus[i][0] <= bus_stop <= bus[i][1]:
            cnt += 1
    return cnt

-> 궁금해 하는 버스 정류장만 골라서 저장하도록 함수 작성

장애물 2.

주석 1!

result = [0] * 5001 -> result = []
result[bus_stop] += bus_cnt(bus_stop) -> result.append(bus_cnt(bus_stop)

헷갈렸던 점.

첫 케이스에 확인할 정류장들이 순서대로 12345로 나와있어서
후자대로 적어도 결과값은 제대로 출력되었다.
print(result[1:P+1])

문제점

하지만, 문제는 케이스에 확인할 정류장 번호가 띄엄띄엄이라면
ex) P=4 / 1,6,8,9
슬라이싱으로 출력값을 나타내기 어렵다.

해결법

그래서 바꾼 코드처럼
필요로 하는 정류장순서대로 버스 노선 갯수를 빈 리스트에
저장하여 전체를 출력하는 것이 맞다.

profile
2021.06 ~

0개의 댓글