dictionary [SWEA] D3 1240. [S/W 문제해결 응용] 1일차 - 단순 2진 암호코드

이영준·2022년 10월 31일
0

알고리즘 문제풀이

목록 보기
3/24

문제링크

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 모두 가져옴
의 딕셔너리 함수를 잊고 있는 나를 발견하는 좋은 기회도 되었다,,,,;;

profile
컴퓨터와 교육 그사이 어딘가

0개의 댓글