알고리즘&문제풀이

[Softeer] 21년 재직자 대회 예선 - 전광판

CSE 2025. 12. 10. 10:16

문제

<설명>

아래와 같은 5자리 전광판이 있다.

각각의 전구, 총 35개의 전구에는 스위치가 개별적으로 달려있다.

어떤 숫자를 다른 숫자로 바꿀 때 스위치를 최소한으로 몇 번 눌러야하는지 구하시오.

 

<입력>

첫 번째 줄에 해결할 테스트 케이스의 수 $T$가 주어진다. ($1\leq T \leq 1000$)
다음 $T$개의 줄에는 한 줄에 테스트 케이스 하나씩이 주어진다.

각각의 줄에는 두 자연수 $A$와 $B$가 공백 하나를 사이로 두고 주어진다.
$A,B$는 한 자리 이상 다섯 자리 이하의 자연수이다.
$A,B$는 숫자 0으로 시작하지 않는다.
$A,B$는 서로 다르다.

 

<출력>

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


풀이

먼저 각 숫자에 따라 스위치의 on/off상태를 반환해주는 convert함수를 만들었다.

-1이라는 값은 숫자가 없는 상태를 의미한다.

def convert(n):
    if n == '-1':
        return [0]*7
    elif n == '0':
        return [1,1,1,0,1,1,1]
    elif n == '1':
        return [0,0,1,0,0,1,0]
    elif n == '2':
        return [1,0,1,1,1,0,1]
    elif n == '3':
        return [1,0,1,1,0,1,1]
    elif n == '4':
        return [0,1,1,1,0,1,0]
    elif n == '5':
        return [1,1,0,1,0,1,1]
    elif n == '6':
        return [1,1,0,1,1,1,1]
    elif n == '7':
        return [1,1,1,0,0,1,0]
    elif n == '8':
        return [1,1,1,1,1,1,1]
    elif n == '9':
        return [1,1,1,1,0,1,1]

 

4자리 숫자와 5자리 숫자를 비교하면 앞에서부터 한글자씩 비교를 하는데, 우리가 원하는 것은 숫자를 오른쪽 정렬한 후 비교하는 것이다.

따라서 f0라는 함수를 만들어 숫자를 오른쪽으로 밀어주는 효과를 내도록 했다.

 

다음으로 각 숫자 칸마다 몇번의 스위치 클릭이 필요한지,

해당 글자칸의 모든 7개의 스위치를 순회하며 카운트하는 함수를 만들었다.

def f0(li):
    relist = []
    for i in range(5-len(li)):
        relist = relist + ['-1']
    relist = relist + li
    return relist

def diff(a,b):
    cnt = 0
    for i in range(7):
        if a[i] != b[i]:
            cnt += 1
    return cnt

a = [[0]*7]*5
#print(a)

n = int(input())
for k in range(n):
    count = 0
    a,b = map(list, input().split())
    a = f0(a)
    b = f0(b)

    for i in range(5):
        a[i] = convert(a[i])
        b[i] = convert(b[i])
        
    for i in range(5):
        count += diff(a[i],b[i])
    print(count)