문제: https://softeer.ai/practice/info.do?idx=1&eid=804&sw_prbl_sbms_sn=79691
# 11문제 런타임 에러.... (62문제중)
def get_occurrence_count(my_list):
new_list = {}
for i in my_list:
try: new_list[i] += 1
except: new_list[i] = 1
return(list(new_list.keys()))
def check_letter(letter,result):
count = len(letter)
if count == 0:
return
else:
#print(count,letter,result)
# 일반적인 경우
if (len(letter) > 1) and (letter[0] != letter[1]):
result.append(letter[0]+letter[1])
#print(result)
letter.pop(1)
letter.pop(0)
#두개가 동일한 값
if (len(letter) > 1) and (letter[0] == letter[1]):
if letter[0] != "X": letter.insert(1,"X")
else: letter.insert(1,"Q")
#마지막 1개 남았을때
if (len(letter) == 1):
letter.insert(1,"X")
count = len(letter)
check_letter(letter,result)
def change_letter(cipher_map, letter_after):
for cipher_map_dim in range(0,5):
for letter_after_dim in range(len(letter_after)):
tmp = list(letter_after[letter_after_dim])
if tmp[0] in cipher_map[cipher_map_dim] and tmp[1] in cipher_map[cipher_map_dim]:
letter_after[letter_after_dim] = str(cipher_map[cipher_map_dim][(cipher_map[cipher_map_dim].index(tmp[0])+1) % 5]) + str(cipher_map[cipher_map_dim][(cipher_map[cipher_map_dim].index(tmp[1])+1) % 5])
return letter_after
def change_final(cipher_map, letter_after):
tmp0_list, tmp1_list= [], []
result = []
for letter_after_dim in range(len(letter_after)):
tmp = list(letter_after[letter_after_dim])
for column in range(5):# 열
for row in range(5): # 행
if tmp[0] == cipher_map[column][row]:
tmp0_list.append(column)
tmp0_list.append(row)
elif tmp[1] == cipher_map[column][row]:
tmp1_list.append(column)
tmp1_list.append(row)
result.append(str(cipher_map[tmp0_list[0]][tmp1_list[1]]) + str(cipher_map[tmp1_list[0]][tmp0_list[1]]))
tmp0_list, tmp1_list= [], []
return result
#input
letter = list(input())
cipher_map = list(input())
#Playfair cipher 암화화 맵 만들기
cipher_map = cipher_map + ["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"]
cipher_map = get_occurrence_count(cipher_map)
tmp = []
tmp.append(cipher_map[0:5])
tmp.append(cipher_map[5:10])
tmp.append(cipher_map[10:15])
tmp.append(cipher_map[15:20])
tmp.append(cipher_map[20:25])
cipher_map = tmp
del tmp
#print(cipher_map)
# 암호화하기위해 2개씩 나누기
letter_after = []
check_letter(letter,letter_after)
#print(letter_after)
del letter
reverse_cipher_map,tmp = [],[]
for row in range(5):# 열
for column in range(5): # 행
tmp.append(cipher_map[column][row])
reverse_cipher_map.append(tmp)
tmp = []
del tmp
#암호화 규칙 적용
result = []
for i in letter_after:
tmp,tmp1 = [],[]
tmp.append(i)
tmp1.append(i)
# print(change_letter(cipher_map, tmp), tmp1)
if change_letter(cipher_map, tmp) != tmp1:
#print("암호화 규칙1")
result = result + tmp
#print(result)
elif change_letter(reverse_cipher_map, tmp) != tmp1:
#print("암호화 규칙2")
result = result + tmp
#print(result)
else:
#print("암호화 규칙3")
result = result + change_final(cipher_map, tmp)
#print(result)
print("".join(result))
반응형