T = int(input())
for test_case in range(1, T + 1):
n, m = map(int, input().split())
ans = [[0 for _ in range(m)] for _ in range(n)]
for i in range(n):
ans[i] = list(input())
def converter(digit_list):
converted = []
num_cnt = 1
for i in range(len(digit_list)-1):
if digit_list[i] == digit_list[i+1]:
num_cnt += 1
else:
converted.append(num_cnt)
num_cnt = 1
converted.append(num_cnt)
real_num = []
code_dict = {(3, 2, 1, 1): 0,
(2, 2, 2, 1): 1,
(2, 1, 2, 2): 2,
(1, 4, 1, 1): 3,
(1, 1, 3, 2): 4,
(1, 2, 3, 1): 5,
(1, 1, 1, 4): 6,
(1, 3, 1, 2): 7,
(1, 2, 1, 3): 8,
(3, 1, 1, 2): 9,
}
if len(converted) > 4:
for key in code_dict.keys():
if (converted[1], converted[2], converted[3]) == key[1:]:
real_num.append(code_dict[key])
break
i = 4
for _ in range(6):
for key in code_dict.keys():
if (converted[i], converted[i+1], converted[i+2], converted[i+3]) == key[:]:
real_num.append(code_dict[key])
break
i += 4
for key in code_dict.keys():
if (converted[i], converted[i+1], converted[i+2]) == key[:3]:
real_num.append(code_dict[key])
return real_num
for i in range(n):
res = converter(ans[i])
if (len(res)) == 8:
if ((res[0]+res[2]+res[4]+res[6])*3+res[1]+res[3]+res[5]+res[7]) % 10 == 0:
print(f'#{test_case} {sum(res)}')
else:
print(f'#{test_case} 0')
break
0과 1이 반복되는 수열에서 암호에 해당하는 부분이 있는지를 판별하고 가져오는 문제이다.
중요한건 처음에 0이 계속 반복되다가 암호가 등장하므로 몇번째 0에서부터가 암호의 시작인지를 알아야 했다.
따라서 첫번째로 1이 오는 경우에는 암호의 2,3,4번째 자리가 일치하면 0이 앞에 충분히 있을 것임을 알기에 암호로 인식하도록 하였다.
마지막 8번째 암호 코드 역시 4번째 자리를 굳이 보지 않고 1,2,3번째 자리가 일치하면 암호로 판단하게끔 하였다.
지금 생각해보니 0과 1로 반복된 암호를 굳이 (3,2,1,2) 등의 튜플로 변환하는 과정 없이 그대로 쓰는 것이 효율적이었을 듯 싶다.
그리고
dict.keys()
- key 가져옴
dict.values()
- val 가져옴
dict,items()
- key,val 모두 가져옴
의 딕셔너리 함수를 잊고 있는 나를 발견하는 좋은 기회도 되었다,,,,;;