본문 바로가기

코딩테스트/SWEA

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

암호코드 정보가 포함된 2차원 배열을 입력으로 받아 암호코드를 뽑아내, 올바른 암호코드인지 판별하는 문제.

 

 

 

T = int(input()) # 테스트 케이스의 개수 T

for n in range(1, T+1):

    N, M = map(int, input().split()) # 배열의 세로 크기 N, 가로 크기 M 
    scanner = [] # 암호코드 저장하는 배열
    dic = {'0001101':0, '0011001':1, '0010011':2,
           '0111101':3, '0100011':4, '0110001':5,
           '0101111':6, '0111011':7, '0110111':8,
           '0001011':9}
    max_num = 0

    # 배열에 값 저장
    for i in range(N):
        scanner.append(input())

    # 바코드 인식하기
    for code in scanner:

        if '1' in code:
            scanner = code # 인식한 코드만 저장
            break

    # 암호코드 뽑아내기
    for i in range(M-1, -1, -1):

        if(scanner[i] == '1'):
            code = scanner[i-55:i+1]
            break

    odd = 0 # 홀수 자리의 합
    even = 0 # 짝수 자리의 합
    if_odd = True

    # 암호코드 해독하기
    for i in range(0, 56, 7):
        
        if(if_odd): odd += dic[code[i:i+7]] # 홀수합 저장
        else: even += dic[code[i:i+7]] # 짝수합 저장

        if_odd = not if_odd


    # 암호코드 검증하기
    auth = (odd*3)+even # 해독한 암호코드 값
    
    if(auth%10==0): # 암호코드가 올바르면
        print("#%d %d" %(n, odd+even))
        
    else: # 올바르지 않으면
        print("#%d %d" %(n, 0))
 

 

 

[문제풀이]


 

우선 이 문제는 암호코드가 포함된 2차원 배열에서 암호코드를 뽑아내야 한다.

암호코드는 모두 끝자리가 1로 되어있다.

# 암호코드 뽑아내기
    for i in range(M-1, -1, -1):

        if(scanner[i] == '1'):
            code = scanner[i-55:i+1]
            break
 

그래서 뒤에서부터 for문을 돌려, 1이 나오는 자리에서부터 56자리를 뽑으면 암호코드!

그럼 암호화 방식대로 해독하고 (홀수 자리의 합 x 3) + (짝수 자리의 합)이 10의 배수가 되는지 체크하면 된다.