관리 메뉴

JIE0025

[Softeer][level2][21년 재직자 대회 예선] 전광판 - 파이썬(Python) 본문

알고리즘/Softeer

[Softeer][level2][21년 재직자 대회 예선] 전광판 - 파이썬(Python)

Kangjieun11 2023. 1. 28. 23:59
728x90

https://softeer.ai/practice/info.do?idx=1&eid=624 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

문제

현대차그룹에 다니는 당신은 전세계 유가 변동에 대해 실시간으로 파악하기 위해 사무실에 유가를 실시간으로 표시하는 전광판을 설치하였다. 전광판은 최대 다섯 자리의 자연수만을 표시할 수 있도록, 아래와 같이 육각형 모양의 전구 7×5=35개로 구성되어 있다.

 

 

8자 모양의 전구 묶음은 0부터 9까지의 숫자를 표현할 수 있으며, 표현 방법은 아래와 같다. 아래 그림에서 전구가 켜졌으면 검정색, 꺼졌으면 옅은 회색으로 표현되었다.

 

 

예를 들어, 전광판을 통해 9881를 표현하면 아래와 같다. 만의 자리 수가 없기 때문에, 만의 자리에 해당하는 전구들이 모두 꺼져 있음에 유의하라.

 

 

예를 들어, 전광판을 통해 10724를 표현하면 아래와 같다.

 

 

 

각각의 전구에는 스위치가 달려 있다. 전구에 달려 있는 스위치를 누를 때, 그 전구가 켜져 있었다면 꺼지고, 그 전구가 꺼져 있었다면 켜진다.

 

지금 전광판에 자연수 A가 표시되어 있는데, 유가가 변동됨에 따라 전광판에 표시된 자연수를 B로 바꿔야 한다. 이러한 목표를 달성하기 위해 스위치를 최소 몇 번 눌러야 하는지를 구하는 프로그램을 작성하라.

 

 

 

 


 

💡 사고과정

  1. 각 전구의 자리를 정해서 정보를 저장한다 (2차원배열 느낌) 
    • 앞에 추가되는 0은 따로 구분해야한다 (이거 처리해주다가 틀려서 그냥 다른사람의 깔끔한 코드를 약간 참고했다 ㅠㅠ)
      앞에 추가되는 0은 모든 전구가 꺼져있는 상태이므로 0000000으로 처리한다.
  2. 입력 값을 확인하고 5자리로 만들어준다 
    • 역시 앞에 추가하는 0은 따로 생성한 구분자를 이용한다
  3. 5자리를 반복해서 비교한다 그안에선 7번 반복해서 값이 다른지 체크한다
    • 값이 다르면 전구를 스위칭해줘야하는 것!
    • result를 1 증가시켜준다.
  4. result를 출력한다.

 

💻 내가 쓴 더러운 코드 ....  (30점이다 ㅠㅠ)

굉장히 코드가 더럽다

아래 다른 사람의 코드를 참고해서 작성한 코드가 있는데,

사고과정은 똑같은데 코드가 더러워서 어딘가 틀렸나보다.

>> 심지어 정보저장 순서도 똑같이 했는데.... 자료구조를 잘 사용하자 🥲 아직 부족한게 느껴진다..

import sys
input = sys.stdin.readline 

# 정보 저장
# 각 전구의 순서를 정하고, 0과 1로 구분

info = [
#    0 1 2 3 4 5 6
    [1,1,1,0,1,1,1], #0
    [0,0,1,0,0,1,0], #1
    [1,0,1,1,1,0,1], #2
    [1,0,1,1,0,1,1], #3
    [0,1,1,1,0,1,0], #4
    [1,1,0,1,0,1,1], #5
    [1,1,0,1,1,1,1], #6    
    [1,1,1,0,0,1,0], #7
    [1,1,1,1,1,1,1], #8    
    [1,1,1,1,0,1,1]  #9
]

zero = [0,0,0,0,0,0,0]

def checkXOR(num1, num2):
    global a_zero, b_zero

    if a_zero > 0: 
        num1List = zero
        a_zero -=1
    else: 
        num1List = info[int(num1)]

    if b_zero > 0: 
        num2List = zero
        b_zero -= 1
    else: 
        num2List = info[int(num2)]
        
    count =0
    for i in range(7):
        if num1List[i] != num2List[i]:
            count+=1

    return count  


t = int(input())
for _ in range(t):
    a, b = map(str,input().split())
    
    
    #전처리
    a_zero, b_zero = 5-len(a), 5-len(b)
    a = '0' * a_zero + a
    b = '0' * b_zero + b

    result = 0

    for i in range(5):
        aVal, bVal = a[i], b[i]
        if (aVal == bVal):
            if(a_zero): a_zero-=1
            if(b_zero): b_zero-=1
            continue

        else:
            result += checkXOR(aVal, bVal)

    print(result)

 

💻 다른사람의 0 처리를 참고한 정답코드

import sys
input = sys.stdin.readline 

# 정보 저장
# 각 전구의 순서를 정하고, 0과 1로 구분

info = {
    
    '0' : '1110111',
    '1' : '0010010',
    '2' : '1011101',
    '3' : '1011011',
    '4' : '0111010', 
    '5' : '1101011',
    '6' : '1101111',
    '7' : '1110010',
    '8' : '1111111',
    '9' : '1111011',
    ' ' : '0000000'
}


t = int(input())
for _ in range(t):
    a, b = map(str,input().split())
    
    
    #전처리
    a_zero, b_zero = 5-len(a), 5-len(b)
    a = ' ' * a_zero + a
    b = ' ' * b_zero + b

    result = 0

    for i in range(5):
        for j in range(7):
            if(info[a[i]][j] != info[b[i]][j]):
                result+=1
                
    print(result)

 

 

사고과정은 똑같으니 다시 안풀어봐도 될것 같긴한데, 그래도 시험보기전에 한번만 더 풀어봐야겠다.