우당탕탕 개발일지

[숫자] 소프티어 Softeer level 2 전광판 (Python 파이썬) 본문

알고리즘

[숫자] 소프티어 Softeer level 2 전광판 (Python 파이썬)

민아당긴아 2024. 3. 12. 15:21

💡문제 링크

 

Candidate | Softeer Assessment UI

 

softeer.ai

 

💡문제 분석 요약

1. 전광판에 한 자리 수부터 다섯 자리 수까지 입력 가능하다.

2. 전광판에 표시된 숫자를 A에서 B로 바꿀 때 스위치를 최소한 몇 번 눌러야하는지 구하라.(A, B는 0으로 시작하지 않고, 서로 다름)

3. 전광판에 표시된 숫자를 A에서 B로 바꾸는 과정을 T번 반복(1<=T<=1000)

 

💡알고리즘 설계

1. 각 전광판에 번호를 붙이고, 각 숫자별로 전광판에서 어느 스위치가 켜지는지에 대한 정보를 switch 딕셔너리에 담는다

2. 자리수를 맞춰주기 위해 다섯 자리 미만의 수에는 앞에 "x"를 붙인다.(ex. 218 -> xx218)
따라서 switch에 "x"에 해당하는 스위치 정보도 담아야 한다(switch["x"] = [0, 0, 0, 0, 0, 0, 0])
c(스위치 누르는 횟수)를 0으로 초기화한다.

3. A와 B의 첫번째 원소부터 다섯번째 원소까지 돌아가면서 탐색

4-1. A와 B의 첫번째 원소 A1, B1에 대하여 
     A1에서 B1로 바꾸기 위해 스위치를 몇 번 눌러야하는지 구하고, 그 값을 c에 더하기

* A1에서 B1로 바꾸기 위해 스위치를 몇 번 눌러야하는지를 구하는 과정

1) switch[A1]와 switch[B1]의 각 원소를 비교한다

2) 원소의 값이 다르면 스위치를 켰다는 의미이므로, c에 1만큼 더한다

4-2. A와 B의 첫번째 원소 A2, B2에 대하여 
     A2에서 B2로 바꾸기 위해 스위치를 몇 번 눌러야하는지 구하기

...

4-5. A와 B의 첫번째 원소 A5, B5에 대하여 
     A5에서 B5로 바꾸기 위해 스위치를 몇 번 눌러야하는지 구하기

5. c 출력하

💡코드

import sys
switch = {
    "0": "1110111",
    "1": "0010010",
    "2": "0111101",
    "3": "0111011",
    "4": "1011010",
    "5": "1101011",
    "6": "1101111",
    "7": "1110010",
    "8": "1111111",
    "9": "1111011",
    "x": "0000000"
}

t = int(input())
for _ in range(t):
    # 전처리
    a, b = input().split(" ")
    a = "x" * (5 - len(a)) + a
    b = "x" * (5 - len(b)) + b
    c = 0
    # 각 자리수에 대하여 반복
    for i in range(5): 
        for j in range(7):
            if switch[a[i]][j] != switch[b[i]][j]:
                c += 1
    print(c)

 

💡 오답 풀이

switch 딕셔너리에 값 잘못넣음..

처음에는 A, B 자리수가 같은 경우와 다른 경우 두 가지로 나누어서 풀었는데, 코드가 너무 길어졌다.

그래서 A, B가 다섯 자리수 미만인 경우 부족한 만큼 앞에 "x"를 붙이는 전처리를 진행해줬다.

💡 다른 풀이

import sys
switch = {
    "0": [1, 1, 1, 0, 1, 1, 1],
    "1": [0, 0, 1, 0, 0, 1, 0],
    "2": [0, 1, 1, 1, 1, 0, 1],
    "3": [0, 1, 1, 1, 0, 1, 1],
    "4": [1, 0, 1, 1, 0, 1, 0],
    "5": [1, 1, 0, 1, 0, 1, 1],
    "6": [1, 1, 0, 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],
    "x": [0, 0, 0, 0, 0, 0, 0]
}

t = int(input())
for _ in range(t):
    # 전처리
    a, b = input().split(" ")
    a = "x" * (5 - len(a)) + a
    b = "x" * (5 - len(b)) + b
    c = 0
    # 각 자리수에 대하여 반복
    for i in range(5): 
        for j in range(7):
            if switch[a[i]][j] != switch[b[i]][j]:
                c += 1
    print(c)

switch 딕셔너리의 value를 리스트형태로 해서 런타임에러가 발생하는줄 알았는데, 그런 문제는 아니었다.

 

💡 느낀점 or 기억할정보

1. 정수에서는 인덱싱 불가능!!! 인덱싱 해주기 위해 정수가 아닌 문자열로 값을 받음