문제출처 |
[D3] 6485 . 삼성시의 버스 노선
삼성시에 있는 5,000개의 버스 정류장은 관리의 편의를 위해 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 ) 가 주어진다.
[출력]
각 테스트 케이스마다 ‘#x’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고 한 칸을 띄운 후,
한 줄에 P개의 정수를 공백 하나로 구분하여 출력한다.
j번째 정수는 Cj번 버스 정류장을 지나는 버스 노선의 개수여야 한다.
<PASS>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# 6485 . 삼성시의 버스 노선 D3
'''
1. 첫 번째 줄에 테스트 케이스의 수 T
2. 첫 번째 줄에는 하나의 정수 버스노선 N개( 1 ≤ N ≤ 500 )
-다음 N개의 줄의 (1~n)i번째 두 정수 Ai, Bi ( 1 ≤ Ai ≤ Bi ≤ 5,000 )공백
3. 정수 버스정류장 P ( 1 ≤ P ≤ 500 )
-다음 P개의 줄의 j번째 줄 하나의 정수Cj ( 1 ≤ Cj ≤ 5,000 )
'''
# 주의 : 숫자가 int 형태일지 str 형태일지 공백이있을지(.strip()) 모름
T = int(input()) # 테스트케이스 T
for t in range(1,T+1):
n = int(input()) # 버스노선 n개
bus = {} # 키=버스정류장 : 값=노선이 지나는 수
for i in range(n):
a,b = map(int,input().split()) # 각 노선별 버스정류장a~b번까지 지남
for stop in range(a,b+1):
p = int(input()) # 확인해볼 버스정류장 수 P개
result = []
check = 0
for _ in range(p):
check = int(input()) # 확인해볼 버스정류장 입장
if check in bus: # 키에 있으면
result.append(bus[check]) # 카운팅된 값
else: # 키에 없으면
print('#{}'.format(t),*result) # 순서대로 카운팅된 값 출력
|
본격 문풀 오랜만이라 아리송해서 입력에 대한 것만 3번이상 읽으며 긴장하고,
런타임에러가 신나게 걸려서 패닉이었던 버스버스
1. 주의 : 입력값을 int(input()) 으로 받을 것
2. 각 정류장에 몇 개의 버스 노선이 다니는지 구하는지 출력해야 하구나! :
- 한 개 노선이 지나가는 버스정류장 a~b에 있는 것을 카운팅(+1)을 해야겠다.
- 배열(인덱스번호=정류장번호, 값= 카운팅)과 딕셔너리(키=정류장번호, 값= 카운팅)중에
배열로 하면 정류장을 5000개 선언해야 하니깐, 필요한 것만 선언하게 딕셔너리로 해야지. ~
<실험1>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
T = int(input()) # 테스트케이스 T
for t in range(1,T+1):
print('#{}'.format(t),end=' ')
n = int(input()) # 버스노선 n개
bus = {} # 키=버스정류장 : 값=노선이 지나는 수
for i in range(n):
a,b = map(int,input().split()) # 각 노선별 버스정류장a~b번까지 지남
for stop in range(a,b+1):
p = int(input()) # 확인해볼 버스정류장 수 P개
for _ in range(p):
print(bus[int(input())],end=' ') # 바로 입력받자마자 키에 있는지 보고 값 뽑아볼까
print()
|
런타임에러...아. 아아아아~
한 줄 씩 출력 할 때, end =' '로 마지막 값에 띄어쓰기 한게 문제인가?...
그것만 하나 슬라이스로 지울까? 그냥 좋게 배열로 따로 담아서 출력하자.
아
혹시 주어진 정류장번호가 딕셔너리에 없는 키 값을 찾아 KeyError 난게 아닐까?
그렇다면 그것을 어떻게 처리하지? 초기에 딕셔너리의 {키로 정류장 5000개 : 값 0 }으로 다 선언할까? 아니다. 매번 5천개씩 하기 싫다. 어차피 마지막에 배열에 넣어 처리하니깐, 입력 값(버스정류장)이 키 값에 없으면 노카운팅이란 의미에서 0 을 넣어보자! 끝.
-----------------------------------------------------------------------------------------------------------
딕셔너리로 카운팅하는 3가지 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
book_title = ['great', 'the', 'adv', 'of', 'sherlock', 'holmes', 'the', 'great']
# 딕셔너리 카운팅 3가지 방법
print("==========1===========")
a = {}
for i in book_title:
a[i] = book_title.count(i)
print(a)
print("===========2==========")
b = {}
for title in book_title:
if title in b: # 타이틀이 b안에 있는지 검사해서 있으면 트루, 없으면 펄스!!!!!!!!!!
b[title] += 1
else:
b[title] = 1
print(b)
print("===========3==========")
c = {}
for i in book_title:
c[i] = c.get(i,0) + 1
print(c)
|
- 추신 : 애초부터 syntaxError가 나면 제출(PASS/Fail)이력에 남겨지지도 않는다.jaja
유 : 딕셔너리의 key를 체크하는 여러가지 방법에 대해 공부하신것 같습니다. 여러가지 방법으로 같은 기능을 구현하는 모습 좋습니다. 나중에 시간이 된다면 리스트를 이용해서 구현해보세요!
셩 : 딕셔너리에 없는 key값을 읽으려고 할 때 쓸 수 있는 것들이 몇가지 있습니다 get 함수와 defaultdict에 대해서 알아보시면 도움 될 것 같아요 직접 찾아보시면서 코드를 써봐야 공부가 될거에요
'코딩테스트 \파이썬\자바 > SWEA D3' 카테고리의 다른 글
[SWEA] 5110. [파이썬 S/W 문제해결 기본] 7일차 - 수열 합치기 D3 파이썬 (0) | 2020.04.11 |
---|---|
[SWEA] 5108. [파이썬 S/W 문제해결 기본] 7일차 - 숫자 추가 D3 파이썬 (0) | 2020.04.09 |
[SWEA][D3] 5099. [파이썬 S/W 문제해결 기본] 6일차 - 피자 굽기 D3 (0) | 2020.04.02 |
[SWEA][D3] 4676. 늘어지는 소리 만들기 D3 파이썬 (0) | 2020.03.11 |
[SWEA][D3] 1225.[S/W 문제해결 기본] 7일차 - 암호생성기 D3 파이썬 (0) | 2020.02.29 |