본문 바로가기

알고리즘/소프티어

플레이페어 암호

문제

 

https://softeer.ai/practice/info.do?idx=1&eid=804 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

내 풀이

입력으로 메시지와 키를 입력받는다.

원래 입력 받을 때 input()을 사용했었지만, 소프티어 사이트에서는 sys를 사용하길 원하는 것 같아서 sys를 사용한 입력으로 코드를 수정하였다. (시간이 더 빨라짐)

 

key를 가지고 표를 만들었다.

key에 있는 알파벳 먼저 배치한 후, 빈 곳은 사용하지 않은 알파벳을 사용하여 채워 넣었다.

1차원인 board 리스트에 알파벳을 냅다 쑤셔 넣었기 때문에 nboard라는 새로운 리스트를 선언하여 5x5 크기의 2차원 리스트로 만들었다.

 

메시지를 쪼갠 후 같은 알파벳이 연속으로 나열되면 'X'를 넣어라고 했기에 while문을 사용하여 구현하였다.

처음에 파악하지 못했던 것이 있었는데, 'X'를 한 개 집어넣었으면 바로 메세지를 다시 쪼개야 한다는 것이었다.

처음에는 이것을 미처 파악하지 못하고 같은 알파벳이 연속으로 나오는 것 족족 'X'를 집어넣었다. 그래서 메시지의 길이가 엄청 길어졌다. 

 

마지막으로 암호화 과정을 구현하였는데, 단계별로 문제에서 요구하는 대로 그냥 열심히 구현했던 것 같다. 그냥 뇌 빼고 우다다다 구현하면 답이 나온다.

 

import sys

msg = sys.stdin.readline().strip()
key = sys.stdin.readline().strip()

board = []
for k in key:
    if k not in board:
        board.append(k)
alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
for alpha in alphabet:
    if alpha not in board:
        board.append(alpha)

nboard = []
while board:
    arr = []
    for i in range(5):
        arr.append(board.pop(0))
    nboard.append(arr)

while True:
    flag = True
    msg_arr = [msg[i:i+2] for i in range(0, len(msg), 2)]
    for i in range(0, len(msg), 2):
        m = msg[i:i+2]
        if len(m) == 2 and m[0] == m[1]:
            flag = False
            if m[0] != 'X':
                msg = msg[:i+1] + 'X' + msg[i+1:]
            else:
                msg = msg[:i+1] + 'Q' + msg[i+1:]
            break
    if flag: 
        break
if len(msg) % 2 != 0: 
    msg += 'X'

nmsg_arr = [msg[i:i+2] for i in range(0, len(msg)-1, 2)]
answer = ''
for m in nmsg_arr:
    step1, step2 = False, False
    for b in nboard:
        if m[0] in b and m[1] in b:
            idx1, idx2 = b.index(m[0]), b.index(m[1])
            answer += b[(idx1+1)%5] + b[(idx2+1)%5]
            step1 = True
    if not step1:
        for j in range(5):
            arr = [nboard[i][j] for i in range(5)]
            if m[0] in arr and m[1] in arr:
                idx1, idx2 = arr.index(m[0]), arr.index(m[1])
                answer += arr[(idx1+1)%5] + arr[(idx2+1)%5]
                step2 = True
    if not step1 and not step2:
        first, second = None, None
        for i in range(5):
            for j in range(5):
                if nboard[i][j] == m[0]:
                    first = (i, j)
                elif nboard[i][j] == m[1]:
                    second = (i, j)
        answer += nboard[first[0]][second[1]] + nboard[second[0]][first[1]]
print(answer)

 

총평

빡구현이다. 하드코딩 예~