본문 바로가기
문제 풀이/소프티어 (Softeer)

[Python] 소프티어 : 플레이페어 암호

by 희조당 2023. 3. 5.
728x90

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

 

Softeer

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

softeer.ai


💡 문제 풀이

전형적인 구현 문제이다.

 

key에 맞춰서 5x5 짜리 판을 초기화해 주고, 특정 알파벳의 위치를 저장한 테이블을 초기화한다.

이후 2자리로 잘라준다음 요구사항에 맞춰서 구현하면 된다.

 

주의할 점은 X가 단 하나 남았을 경우 XX가 만들어진다는 점과 J를 사용하지 않는다는 점이다.

✔️ 느낀 점

크게 어려울 것 없는 문제였다.

💻 코드

	import sys ; input = sys.stdin.readline
from collections import deque

ALPHABET = "ABCDEFGHIKLMNOPQRSTUVWXYZ"
SIZE = 5

def initBoard(key):
    board = [[0] * SIZE for _ in range(SIZE)]
    tmp = ""

    for ch in key:
        if ch not in tmp:
            tmp += ch

    for ch in ALPHABET:
        if ch not in tmp:
            tmp += ch

    for i in range(SIZE):
        for j in range(SIZE):
            board[i][j] = tmp[i * SIZE + j]

    return board

def initTokens(message):
    tokens = []
    q = deque(list(message))

    while q:
        ch1 = q.popleft()
        ch2 = "X"
        
        if q:
            tmp = q.popleft()
            if ch1 != tmp: ch2 = tmp
            else:
                if ch1 == "X": ch2 = "Q"
                q.appendleft(tmp)
            
        tokens.append(ch1 + ch2)
        
    return tokens

def initTable(board):
    table = {}
    
    for i in range(SIZE):
        for j in range(SIZE):
            table[board[i][j]] = (i, j)
            
    return table

def solution(tokens, board, table):
    encrypt = ""

    for first, second in tokens:
        x1, y1 = table[first]
        x2, y2 = table[second]
        
        if x1 == x2:
            y1 = (y1 + 1) % SIZE
            y2 = (y2 + 1) % SIZE
        elif y1 == y2:
            x1 = (x1 + 1) % SIZE
            x2 = (x2 + 1) % SIZE
        else:
            tmp = y1
            y1 = y2
            y2 = tmp
        
        encrypt += board[x1][y1] + board[x2][y2]
    
    return encrypt

message = input().rstrip()
key = input().rstrip()
board = initBoard(key)
tokens = initTokens(message)
table = initTable(board)

print(solution(tokens, board, table))

댓글