본문 바로가기
알고리즘 공부/Python

SWEA 1242 암호 코드 스캔(Python)

by 킴워니 2020. 5. 6.
험한말

문제는 여기

 

SW Expert Academy

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

swexpertacademy.com

 

단순 암호문제보다 업그레이드 된 문제이다. 

그냥 사실 구현만 하면 되는데 구현을 못할 것만 같은 문제다...^^... 

사실 모든 문제는 구현만 하면 된다...ㅎ.... 그렇다....

 

사실 암호 검증은 단순 암호 문제에서 이미 했던 부분이고 이 문제에서 핵심은

1. 암호가 한개 이상일 수 있다.

2. 암호의 넓이가 정해져 있지 않다.

인데 한개이상인 부분은 완탐을 돌리면 되지만 넓이가 정해져있지 않은 것이 아주 골치 아팠다. 그냥 숫자를 몇시간 째려본 결과 찾아낸 규칙은

 1. 모든 코드는 0으로 시작해 1로 끝난다.

 2. 0으로 시작해 1로 끝날 때 의 숫자 변화는 세번이다 (0->1->0->1)

 3. 모든 숫자에 한번만에 binary number 가 변할 때가 있다!

이 세가지의 규칙을 잘 이용한다면 새로운 딕셔너리를 짜내서 크기와 상관없이 숫자를 낼 수 있다고 생각했다!

 

구현 코드

더보기
"""
swea 1242 암호코드 스캔
code written by jungwonkkim
"""

decode = {'112':0, '122':1, '221':2,'114':3, '231':4,'132':5, '411':6, '213':7, '312':8, '211':9}
hex_to_bin = {'0':'0000', '1':'0001', '2':'0010','3':'0011','4':'0100','5':'0101','6':'0110','7':'0111','8':'1000','9':'1001','A':'1010','B':'1011','C':'1100','D':'1101','E':'1110','F':'1111'}


def examine(arr): #검증조건 맞는지
    if ((arr[7]+arr[5]+arr[3]+arr[1])*3 + arr[0]+arr[2]+arr[4]+arr[6]) % 10:
        return False
    return True

T = int(input())
for test_case in range(1, T+1):
    N, M = map(int, input().split())
    big_code = [input()[:M] for _ in range(N)]
    visited = []
    ans = 0
    for n in range(N):
        binarified = ''
        for char in big_code[n]:
            binarified += hex_to_bin[char]
        big_code[n] = binarified
    res = []
    for n in range(N):
        f1 = f2 = f3 = 0
        if '1' not in big_code[n]:
            continue
        for m in range(M*4-1,-1,-1):
            if f2 == 0 and f3 == 0 and big_code[n][m] =='1': #첫 1
                f1 += 1
            elif f1 and f3 == 0 and big_code[n][m] == '0': #10
                f2 += 1
            elif f1 and f2 and big_code[n][m] == '1': #101
                f3 += 1
            elif f3 and big_code[n][m] == '0':
                mul = min(f1, f2, f3)
                res.append(decode[str(f1//mul)+str(f2//mul)+str(f3//mul)])
                f1 = f2 = f3 = 0
                if len(res) == 8:
                    if res not in visited:
                        if examine(res):
                            ans += sum(res)
                        visited.append(res)
                    res = []
    print('#{} {}'.format(test_case, ans))

댓글