Computer Science/알고리즘(백준+프로그래머스)

Softeer) 플레이페어 암호_Python

#문제

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

 

Softeer

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

softeer.ai

#문제 분석

- 음.. 아주아주 조건이 많은 빡구현 문제이다. 코드 한줄이라도 틀리면 그냥 바로 틀리기 딱 쉬운 문제..? 딱히 알고리즘은 없고 주어진 조건만 잘 구현하면 될듯하다. 이런 문제는 중간중간 디버깅을 해가면서 맞았는지 확인해봐야 시간 낭비를 안할 것 같다. 현대도 구현을 좋아하나..?

- 딕셔너리를 잘 활용했더니 마지막 변환 과정에서 좌표를 따로 손대지 않고 쉽게 풀 수 있었다.

 

#코드

import sys
from collections import deque

input=sys.stdin.readline

message=input().rstrip()
key=input().rstrip()
keyQ=deque(list(key))

board=[[None]*5 for _ in range(5)]
key_loc={}
duplicate=[0]*26
duplicate[9]=1

cur=0
for i in range(5):
    for j in range(5):
        while keyQ:
            char=keyQ[0]
            if duplicate[ord(char)-65]==0:
                duplicate[ord(char)-65]=1
                keyQ.popleft()
                board[i][j]=char
                key_loc[char]=(i,j)
                break
            else:
                keyQ.popleft()
                    

        else:
            for d in range(len(duplicate)):
                if(duplicate[d]==0):
                    duplicate[d]=1
                    board[i][j]=chr(65+d)
                    key_loc[chr(65+d)]=(i,j)
                    break


split_messsage=[]
i=0
while i<len(message):
    if i==len(message)-1:
        split_messsage.append(message[i]+'X')
        break
    
    elif message[i]==message[i+1]:
        if(message[i]=='X'):
            split_messsage.append(message[i]+"Q")
            
        else:
            split_messsage.append(message[i]+"X")
        i=i+1

    else:
        split_messsage.append(message[i:i+2])
        i=i+2


answer=""
for a,b in split_messsage:
    ar,ac=key_loc[a][0],key_loc[a][1]
    br,bc=key_loc[b][0],key_loc[b][1]
 
    if ar==br:
    	ac-=1 if ac!=4 else 0 
   		bc-=1 if bc!=4 else 0
              
    elif ac==bc:
    	ar+=1 if ar!=4 else 0
        br+=1 if br!=4 else 0
        
    else:
        ac,bc=bc,ac

    answer+=board[ar][ac]+board[br][bc]

print(answer)