카테고리 없음

[softeer] 플레이페어 암호 python

만땅이 2022. 9. 6. 12:30

문제: 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) > 1and (letter[0] != letter[1]):
            result.append(letter[0]+letter[1])
            #print(result)
            letter.pop(1)
            letter.pop(0)
            
        #두개가 동일한 값
        if (len(letter) > 1and (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[0in cipher_map[cipher_map_dim] and tmp[1in 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))
반응형