[Softeer / Python] 전광판
문제 링크:
문제 이해
7×5 전구 배열로 숫자를 표현하는 전광판이 있으며, 각 숫자는 0~9까지 나타낼 수 있음.
- A에서 B로 전광판 숫자를 변경하는데, 최소한으로 스위치를 눌러서 전구의 상태를 바꿔야 함.
- 입력:
- T개의 테스트 케이스.
- 각 테스트 케이스마다 두 개의 자연수 A와 B가 주어짐.
- A와 B는 1자리 이상 5자리 이하의 숫자이며, 만약 자릿수가 비어있는 경우, 7개의 전구가 모두 켜지지 않음에 유의.
- 출력: A를 B로 바꾸기 위한 최소 스위치 누름 횟수.
해결 전략
- 각 숫자에 대해 segment를 설정
- 비어있는 자릿수 구현을 위해 reverse하여 자릿수만큼 None(비어있는 segment) 채우기
- 모든자릿수에 대해 리스트를 만든 뒤 element-wise 차이 구하기
구현 코드, 풀이
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
30
31
32
33
34
35
36
37
n = int(input())
list_price = []
for r in range(n):
list_price.append(map(str, input().split()))
segment_none = [0, 0, 0, 0, 0, 0, 0]
segment = {
0: [1, 1, 1, 1, 1, 1, 0],
1: [0, 1, 1, 0, 0, 0, 0],
2: [1, 1, 0, 1, 1, 0, 1],
3: [1, 1, 1, 1, 0, 0, 1],
4: [0, 1, 1, 0, 0, 1, 1],
5: [1, 0, 1, 1, 0, 1, 1],
6: [1, 0, 1, 1, 1, 1, 1],
7: [1, 1, 1, 0, 0, 1, 0],
8: [1, 1, 1, 1, 1, 1, 1],
9: [1, 1, 1, 1, 0, 1, 1]
}
def mk_segment(price):
reverse = price[::-1]
price_list = []
for u in range(5):
if u < len(price):
price_list.append(segment[int(reverse[u])])
else:
price_list.append(segment_none)
return price_list
for oil_price in list_price:
first, second = oil_price
first_segment = mk_segment(first)
second_segment = mk_segment(second)
list_diff = [[abs(first_segment[i][j] - second_segment[i][j]) for j in range(len(first_segment[0]))] for i in range(len(first_segment))]
print(sum(sum(row) for row in list_diff))
main
:- 입력을 받아서 가격을 저장하는
list_price
리스트를 구성함. - 반복문을 통해 각 주유 가격을 처리하며, 두 가격의 7세그먼트 배열을 계산하고 차이를 출력.
- 7세그먼트 디스플레이 차이 계산:
- 두 가격을 7세그먼트로 변환한 후, 각 자릿수마다 켜짐/꺼짐 상태의 차이를 계산함.
- 차이를 모두 합산하여 두 주유 가격 간의 LED 상태 변화량을 출력.
- 입력을 받아서 가격을 저장하는
mk_segment
함수:- 입력받은 가격을 7세그먼트 배열로 변환함. 가격의 각 자리에 해당하는 숫자를
segment
배열에서 찾아 7개의 LED 상태를 반환. - 5자리 이하의 가격은 오른쪽에서부터 맞춰져 변환되며, 빈 자리에는
segment_none
을 추가하여 처리.
- 입력받은 가격을 7세그먼트 배열로 변환함. 가격의 각 자리에 해당하는 숫자를
This post is licensed under CC BY 4.0 by the author.