Algorithm/Simulation

[Python] SWEA 1240번 단순 2진 암호코드

코딩쪼앙 2023. 5. 9. 20:53

문제

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제 풀이

  • 문제를 해결하기 위해 필요한 암호의 규칙은 일단 모든 암호값이 1로 끝나고, 암호 안에 1이 한 번도 없는 암호가 없다는 점이다.
  • 따라서 암호를 해독하기 위해 필요없는 행과 열의 값들을 모두 삭제한다.
  • 행은 1이 한번이라도 등장하는 곳을 빼고 모두 잘라내고, 열은 마지막 1을 가지는 인덱스 값을 구해 마지막 인덱스까지 열의 길이가 56이 될 수 있또록 자른다.
  • 그 후 해독해야하는 암호들만 남아있는 문자열을 사용하여 문자를 7개씩 잘라가며 해독하여 해독한 값을 새로운 배열에 모두 저장한다.
  • 그 후 암호 검증과정에 따라 인덱스가 홀수인 경우 3을 곱하여 더하고, 짝수인 경우 인덱스 값을 더한 후, 이 값이 10의 약수라면 해독된 암호값들을 모두 더하여 출력하고, 그렇지 않다면 0을 출력한다.

코드

pattern = {
    "0001101": 0,
    "0011001": 1,
    "0010011": 2,
    "0111101": 3,
    "0100011": 4,
    "0110001": 5,
    "0101111": 6,
    "0111011": 7,
    "0110111": 8,
    "0001011": 9
}

# 유효한 코드 추출
def extract_code():
    # 필요 없는 행 모두 제거
    index = -1
    for i in range(n):
        if '1' in array[i]:
            index = i
            break
    code = array[index]

    # 56길이의 암호추출
    valid_code = ''
    for i in range(len(code) - 1, -1, -1):
        if code[i] == '1':
            valid_code += code[i-55:i + 1]
            break

    return valid_code

t = int(input())
for tc in range(t):
    n,m = map(int,input().split())
    array = [input() for _ in range(n)]

    # 유효한 코드로 암호 해독하기
    code = extract_code()
    result = []
    for i in range(0,56,7):
        decode = code[i:i+7]
        result.append(pattern[decode])

    # 유효한 숫자인지 검증
    number = 0
    for i in range(len(result)):
        # 홀수자리 합 * 3
        if i % 2 == 0:
            number += result[i] * 3
        else:
            number += result[i]

    if not number % 10:
        print(f'#{tc + 1}',sum(result))
    else:
        print(f'#{tc + 1}',0)