험한말
단순 암호문제보다 업그레이드 된 문제이다.
그냥 사실 구현만 하면 되는데 구현을 못할 것만 같은 문제다...^^...
사실 모든 문제는 구현만 하면 된다...ㅎ.... 그렇다....
사실 암호 검증은 단순 암호 문제에서 이미 했던 부분이고 이 문제에서 핵심은
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))
'알고리즘 공부 > Python' 카테고리의 다른 글
백준 16236 아기상어 (Python) (0) | 2020.05.05 |
---|---|
백준 16235 나무 재테크 (Python) (0) | 2020.05.04 |
백준 5373 큐빙 (Python) (0) | 2020.05.03 |
백준 15684 사다리조작 (python) (0) | 2020.05.03 |
백준 14499. 주사위 굴리기 (Python) (0) | 2020.05.01 |
댓글