알고리즘/SWEA

[Python] SWEA 1240 : 단순 2진 암호코드

suwonieee 2023. 2. 27. 16:48

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD&categoryId=AV15FZuqAL4CFAYD&categoryType=CODE 

 

SW Expert Academy

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

swexpertacademy.com

ANS

def getcode(s):
    tmp = ''
    for i in s:
        tmp += i
    password = {'0001101': 0, '0011001': 1, '0010011': 2, '0111101': 3, '0100011': 4,
                '0110001': 5, '0101111': 6, '0111011': 7, '0110111': 8, '0001011': 9}
    return password[tmp]

T = int(input())
for tc in range(1,T+1):
    N,M = map(int, input().split())  # 세로 N, 가로 M
    arr = [list(input()) for _ in range(N)]
    st = 0
    for row in range(N):
        if '1' in arr[row]:
            tmp = arr[row]  # 한 줄에 대해서만 조사해도 암호를 판별할 수 있다. #0만 들어있는 줄은 고려하지 않을 것이다.
            st = M-1-arr[row][::-1].index('1')-55 # 이 문제의 포인트. 뒤에서부터 1을 찾는 방법
            break
    codes =[]
    for _ in range(8):
        codes.append(getcode(arr[row][st:st+7]))
        st += 7
    ans = 0
    for idx in range(8):
        if idx%2 == 0:
           ans += codes[idx]*3
        else:
            ans+= codes[idx]
    if ans % 10 == 0:
        print(f'#{tc} {sum(codes)}')
    else:
        print(f'#{tc} 0')

🔑

더보기

이 문제의 포인트는 2차원 배열의 뒤에서부터 접근하는 방법을 아느냐는 것이다. 2차원 배열의 뒤에서부터 접근하는 방법을 잘 몰랐기 때문에 1차 시도 코드가 매우 길어졌고, keyerror에 잘 대응하지 못했다. 

또한, 모든 비밀번호가 1로 끝나는 것을 발견하지 못한 상태로 문제 풀이에 임해 간단한 문제를 굉장히 복잡하게 풀었다.

우선 1이 있어야만 암호가 존재할 수 있기 때문에 1이 없는 줄은 과감히 넘기고, 1이 있는 줄의 경우 마지막 1이 몇 번째에 위치했는지를 구하고자 했다. 그 후, 암호의 길이가 56이기 때문에 55개만큼 빼줬다. st는 우리가 찾고자 하는 암호문이다.

그 후 암호문을 돌면서 getcode 안의 password 딕셔너리를 이용해 암호를 구했다.

 

문제를 꼼꼼하게 읽을 것.

늘 생각하는 거지만 성격이 급해 문제에서 충분히 얻을 수 있는 힌트를 얻지 못해 어렵게 돌아가는 경우가 많았다.