/////
Search
Duplicate

전광판

태그
기타
체크 필요

문제

현대차그룹에 다니는 당신은 전세계 유가 변동에 대해 실시간으로 파악하기 위해 사무실에 유가를 실시간으로 표시하는 전광판을 설치하였다.
전광판은 최대 다섯 자리의 자연수만을 표시할 수 있도록, 아래와 같이 육각형 모양의 전구 7×5=35개로 구성되어 있다.
8자 모양의 전구 묶음은 0부터 9까지의 숫자를 표현할 수 있으며, 표현 방법은 아래와 같다. 아래 그림에서 전구가 켜졌으면 검정색, 꺼졌으면 옅은 회색으로 표현되었다.
예를 들어, 전광판을 통해 9881를 표현하면 아래와 같다. 만의 자리 수가 없기 때문에, 만의 자리에 해당하는 전구들이 모두 꺼져 있음에 유의하라.
예를 들어, 전광판을 통해 10724를 표현하면 아래와 같다.
각각의 전구에는 스위치가 달려 있다. 전구에 달려 있는 스위치를 누를 때, 그 전구가 켜져 있었다면 꺼지고, 그 전구가 꺼져 있었다면 켜진다.
지금 전광판에 자연수 A가 표시되어 있는데, 유가가 변동됨에 따라 전광판에 표시된 자연수를 B로 바꿔야 한다. 이러한 목표를 달성하기 위해 스위치를 최소 몇 번 눌러야 하는지를 구하는 프로그램을 작성하라

제약조건

하나의 입력에서 1개 이상 1000개 이하의 테스트 케이스를 해결해야 한다.
A와 B는 한 자리 이상 다섯 자리 이하의 자연수이다.
A와 B는 숫자 0으로 시작하지 않는다.
A와 B는 서로 다르다.

입력

첫 번째 줄에 해결할 테스트 케이스의 수 T가 주어진다.
다음 T개의 줄에는 한 줄에 테스트 케이스 하나씩이 주어진다. 각각의 줄에는 두 자연수 A와 B가 공백 하나를 사이로 두고 주어진다.

출력

각각의 테스트 케이스마다 순서대로, 스위치를 눌러야 하는 최소 횟수를 한 줄에 하나씩 출력한다.

예시1

입력

2 1 2 9881 10724
Plain Text
복사

출력

5 11
Plain Text
복사

예시2

입력

2 111 11 11 11111
Plain Text
복사

출력

2 6
Plain Text
복사

정답

import sys # 두 리스트의 차이 개수 구하기 def diff(list1, list2): N = len(list1) res = 0 for i in range(N): if list1[i] != list2[i]: res += 1 return res # 5 자리 맞추기 -> 5자리가 안 되는 경우 앞에 'x'를 붙임 def digit_maker(string): if len(string) == 5: return string else: return 'x'*(5-len(string)) + string clock_dict = dict() clock_dict['x'] = [0,0,0,0,0,0,0] # 모두 꺼져 있는 경우 clock_dict['0'] = [1,1,1,0,1,1,1] clock_dict['1'] = [0,0,1,0,0,1,0] clock_dict['2'] = [1,0,1,1,1,0,1] clock_dict['3'] = [1,0,1,1,0,1,1] clock_dict['4'] = [0,1,1,1,0,1,0] clock_dict['5'] = [1,1,0,1,0,1,1] clock_dict['6'] = [1,1,0,1,1,1,1] clock_dict['7'] = [1,1,1,0,0,1,0] clock_dict['8'] = [1,1,1,1,1,1,1] clock_dict['9'] = [1,1,1,1,0,1,1] answer_list = [] T = int(sys.stdin.readline()) for _ in range(T): a, b = list(sys.stdin.readline().split()) a = digit_maker(a) # 5자리 맞추기 b = digit_maker(b) cnt = 0 for i in range(5): # 앞에서부터 차이 나는 개수 구하기 cnt +=diff(clock_dict[a[i]], clock_dict[b[i]]) answer_list.append(cnt) for answer in answer_list: print(answer)
Python
복사

풀이

전구의 꺼짐과 켜짐을 반영하는 리스트를 만들어서 풀었다.
우선 각 자리에 위치한 전구의 개수는 모두 7개로 동일하다.
그럼 각 자리에 위치한 전구의 꺼짐과 켜짐은 7개의 원소로 구성된 리스트로 나타낼 수 있다.
예를 들어 다음과 같이 전구의 위치에 indexing을 하고 꺼짐은 0으로 켜짐은 1로 표시하자.
그러면 예를 들어 1이면 2와 5의 위치에 불이 들어온 것이므로 [0,0,1,0,0,1,0]로 표현될 수 있다.
따라서 자연수 A, B에 대해서 각각 5개의 리스트가 나올 것이고 1대1로 대응하여 비교하면 된다.
예를 들어 자연수 A와 B의 일의 자리가 각각 1과 2라고 해보자.
그러면 1의 리스트는 [0,0,1,0,0,1,0] 이고 2의 리스트는 [1,0,1,1,1,0,1]이다. 이때 0에서 1또는 1에서 0으로 변한 것의 개수는 5개이다. 이런식으로 일의 자리에서 만의 자리까지 모두 비교하여 개수를 더하면 된다.
다만 주의해야 하는 것은 모두 꺼진 것을 반영해주어야 하므로 숫자가 다섯자리가 안 된다면 앞에 ‘x’를 붙여서 이 곳은 모두 꺼진 곳이라는 표시를 해주어야 한다.
# 두 리스트의 차이 개수 구하기 def diff(list1, list2): N = len(list1) res = 0 for i in range(N): if list1[i] != list2[i]: res += 1 return res # 5 자리 맞추기 -> 5자리가 안 되는 경우 앞에 'x'를 붙임 def digit_maker(string): if len(string) == 5: return string else: return 'x'*(5-len(string)) + string clock_dict = dict() clock_dict['x'] = [0,0,0,0,0,0,0] # 모두 꺼져 있는 경우 clock_dict['0'] = [1,1,1,0,1,1,1] clock_dict['1'] = [0,0,1,0,0,1,0] clock_dict['2'] = [1,0,1,1,1,0,1] clock_dict['3'] = [1,0,1,1,0,1,1] clock_dict['4'] = [0,1,1,1,0,1,0] clock_dict['5'] = [1,1,0,1,0,1,1] clock_dict['6'] = [1,1,0,1,1,1,1] clock_dict['7'] = [1,1,1,0,0,1,0] clock_dict['8'] = [1,1,1,1,1,1,1] clock_dict['9'] = [1,1,1,1,0,1,1] answer_list = [] T = int(sys.stdin.readline()) for _ in range(T): a, b = list(sys.stdin.readline().split()) a = digit_maker(a) # 5자리 맞추기 b = digit_maker(b) cnt = 0 for i in range(5): # 앞에서부터 차이 나는 개수 구하기 cnt +=diff(clock_dict[a[i]], clock_dict[b[i]]) answer_list.append(cnt) for answer in answer_list: print(answer)
Python
복사