문제
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)
총평
빡구현이다. 하드코딩 예~