본문 바로가기
Problem Solving/SWEA

[SWEA|파이썬] 1240. [S/W 문제해결 응용] 1일차 - 단순 2진 암호코드 (D3)

by 청량리 물냉면 2023. 5. 14.
반응형
문제

https://tinyurl.com/2l8cryve

 

SW Expert Academy

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

swexpertacademy.com

 

 

🐍파이썬
T = int(input())
for test_case in range(1, T+1):
    n, m = map(int, input().split())
    code = []
    dic = {"0001101":0, "0011001":1, "0010011":2, "0111101":3,
           "0100011": 4, "0110001": 5, "0101111": 6, "0111011": 7,
           "0110111": 8, "0001011": 9}
    code_arr = []
    for _ in range(n):
        a = list(map(int, input()))
        if 1 in a:	#0만 든 배열은 skip
            code = a[::-1]	#1이 든 가장 마지막 배열만 뒤집어 저장
    j = 0
    while j < len(code):
        arr = ''.join(map(str, code[j:j+7][::-1]))
        if arr[-1]=="1" and arr in dic.keys():
            code_arr.insert(0, dic[arr])
            j+=7
        else:
            j+=1
    a = sum(code_arr[0::2])	#홀수자리 수만 추출
    b = sum(code_arr[1::2])	#짝수자리 수
    if (a*3+b)%10==0:
        ans = a+b
    else:
        ans = 0
    print("#{} {}".format(test_case, ans))

💡 아이디어 & 풀이과정

1️⃣ 암호코드의 특성상 마지막 자리가 모두 1로 끝나기 때문에, 이에 착안하여 code 변수에 입력받은 문자열을 뒤집어 저장했다.

2️⃣ 뒤에서부터 j를 1씩 늘려가며 1가 언제 등장하는지 확인한다. 1이 등장하면 그로부터 7개의 문자열이 암호라는 뜻이므로 7개씩 숫자를 묶는다. 이때 j는 +1이 아닌 +7이 되어야 이미 묶여있는 문자열을 건너뛴 다음 글자를 탐색할 수 있다.

3️⃣7개씩 묶인 이 문자열의 순서를 뒤집은 후(뒤에서부터 search중이므로 원상복구해야 함) dic에서 문자열과 key-value로 연결된 숫자를 찾아 배열의 가장 앞부분에 삽입한다. (뒤에서부터 카운팅하고 있므로 append(dic[arr]) 대신 insert(0, dic[arr])사용해야 함)

4️⃣ 암호코드의 진위를 확인한 뒤 진위판별을 통과하면 각 자리 수의 합을, 진위판별을 통과하지 못하면 0을 출력한다.

 

반응형