본문 바로가기

알고리즘/소프티어

[파이썬] Softeer 연습문제 #23. [21년 재직자 대회 예선] 전광판 완벽해설

 

 

문제

 

https://softeer.ai/practice/6268

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

현대차그룹에 다니는 당신은 전세계 유가 변동에 대해 실시간으로 파악하기 위해 사무실에 유가를 실시간으로 표시하는 전광판을 설치하였다. 전광판은 최대 다섯 자리의 자연수만을 표시할

softeer.ai

 
 
 
해설

 

이 문제는 일단 각각의 숫자를 7개 전구의 스위치 ON/OFF 방식의 데이터로 변환해줄 필요가 있다.

 

 

현재 7개의 전구가 있는데, 위아래, 좌우 순으로 순서를 정해 7개의 숫자로 표현해준다. 예를 들어 1번을 나타내고 싶을 경우 3번째랑 6번째 전구만 ON이면 되므로 0010010 으로 표현해주고, 3을 표현해주고 싶을 경우엔 1,3,4,6,7 번의 전구가 ON이어야만 하므로 1011011의 방식으로 표현을 해준다.

 

이를 토대로 각각의 숫자를 표현해주면

 

import sys
import math

num_switch = {
    "0": "1110111",
    "1": "0010010",
    "2": "1011101",
    "3": "1011011",
    "4": "0111010",
    "5": "1101011",
    "6": "1101111",
    "7": "1110010", # 1010010이 아님
    "8": "1111111",
    "9": "1111011",
    "N": "0000000"
}

 

위처럼 표현해줄 수 있다. 여기서 "N"은 전구가 하나도 켜있지 않은, 즉 빈 숫자를 표현해줄 때 사용한다.

 

 

T = int(input())
tests = []
for _ in range(T):
    tests.append(list(map(str, sys.stdin.readline().split())))

# min(tmp_min, tmp_count)
for test1, test2 in tests:
    tmp_count = 0
    
    if len(test1) > len(test2):
        test2 = (len(test1)-len(test2))*"N"+test2
    elif len(test1) < len(test2):
        test1 = (len(test2)-len(test1))*"N"+test1
    else:
        pass
    
    for i in range(len(test1)):
        a = num_switch[test1[i]]
        b = num_switch[test2[i]]
        # print(f"a:{a}")
        # print(f"b:{b}")
        
        for j in range(len(a)):
            if a[j] != b[j]:
                tmp_count += 1
    print(tmp_count)

 

이제 가장 먼저 A와 B의 숫자의 길이가 다를 경우 이 숫자의 길이를 맞춰주고, (예를 들어, A가 11, B가 111일 때 A 앞에 N을 붙여 A는 N11, B는 111 로 맞춰주는 방식으로.)

 

A와 B라는 숫자가 있을 때, 최소한으로 필요한 스위치의 갯수는 A와 B의 자연수를 위의 스위치 형식으로 변환해준 후, 변환A(자연수 A를 스위치 방식으로 바꿈)와 변환B(마찬가지로 자연수 B를 스위치 방식으로 바꿈)의 각각의 숫자 중 다른 경우가 있을 때 스위치 갯수를 1씩 더해주면 된다.

 

그럼 결국 A와 B의 자연수가 주어졌을 때 필요한 스위치 갯수를 구할 수 있게 된다.

 

 

코드

 

import sys
import math

# 각 숫자를 스위치 형식으로 변환해준다.
num_switch = {
    "0": "1110111",
    "1": "0010010",
    "2": "1011101",
    "3": "1011011",
    "4": "0111010",
    "5": "1101011",
    "6": "1101111",
    "7": "1110010", # 1010010이 아님
    "8": "1111111",
    "9": "1111011",
    "N": "0000000"
}

# 데이터를 받는다.
T = int(input())
tests = []
for _ in range(T):
    tests.append(list(map(str, sys.stdin.readline().split())))

# 각각의 자연수 A와 B에 대해서
for test1, test2 in tests:
    tmp_count = 0
    
    # 숫자의 길이가 다를 경우 "N"을 넣어주어 길이를 맞춰주고,
    if len(test1) > len(test2):
        test2 = (len(test1)-len(test2))*"N"+test2
    elif len(test1) < len(test2):
        test1 = (len(test2)-len(test1))*"N"+test1
    else:
        pass
    
    # 이제 스위치 형식으로 변환된 A와 B의 각각의 숫자의 다름을 판단한다.
    # 다르다는 건 결국 한쪽 전구의 스위치를 켜주거나 꺼주어야 한다는 의미이므로
    # 다르면 1씩 더해준다.
    for i in range(len(test1)):
        a = num_switch[test1[i]]
        b = num_switch[test2[i]]
        
        for j in range(len(a)):
            if a[j] != b[j]:
                tmp_count += 1
    
    # 마지막으로 최소한으로 눌러야할 스위치를 각각의 자연수 A,B의 계산 결과에 따라 출력한다.
    print(tmp_count)

 

 

결과