몸과 마음이 건전한 SW 개발자

Softeer level3 [HSAT 3회 정기 코딩 인증평가 기출] 플레이페어 암호 Python 본문

알고리즘

Softeer level3 [HSAT 3회 정기 코딩 인증평가 기출] 플레이페어 암호 Python

스위태니 2023. 8. 21. 00:57

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

 

Softeer

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

softeer.ai

오답 코드

import sys
input = sys.stdin.readline
message = input().strip()
secretKey = input().strip()
fairKey = []
fair = ""

for idx in range(len(message)):
    if len(fair) == 2:
        fairKey.append(fair)
        fair = ""
    
    if fair == message[idx]:
        if fair == "X":
            fairKey.append(fair+"Q")
        else:
            fairKey.append(fair+"X")
        fair = message[idx]
    else:
        fair += message[idx]

    if idx == len(message) - 1:
        if len(fair) == 2:
            fairKey.append(fair)
        else:
            fair += "X"
            fairKey.append(fair)
    
board = [["" for _ in range(5)] for _ in range(5)]
alphabet = {
    "A": 0, "B": 0, "C": 0, "D": 0, "E": 0,
    "F": 0, "G": 0, "H": 0, "I": 0, "K": 0,
    "L": 0, "M": 0, "N": 0, "O": 0, "P": 0,
    "Q": 0, "R": 0, "S": 0, "T": 0, "U": 0,
    "V": 0, "W": 0, "X": 0, "Y": 0, "Z": 0
}
r_idx = 0
c_idx = 0
for alpha in secretKey:
    if alphabet[alpha]:
        continue
    alphabet[alpha] += 1
    board[r_idx][c_idx] = alpha
    c_idx += 1
    if c_idx == 5:
        c_idx = 0
        r_idx += 1

for alpha, number in alphabet.items():
    if number:
        continue
    board[r_idx][c_idx] = alpha
    c_idx += 1
    if c_idx == 5:
        c_idx = 0
        r_idx += 1

columnBoard = []
for c in range(5):
    tmp = []
    for r in range(5):
        tmp.append(board[r][c])
    columnBoard.append(tmp)

result = ""
for f in fairKey:
    tmp = ["", ""]
    for r in range(5):
        # 행 먼저 검색
        idx = 0
        if f[0] in board[r] and f[1] in board[r]:
            for c in range(5):
                if f[0] == board[r][c]:
                    idx = (c+1)%5
                    tmp[0] = board[r][idx]
                if f[1] == board[r][c]:
                    idx = (c+1)%5
                    tmp[1] = board[r][idx]
            result += (tmp[0]+tmp[1])
            break
            # 열검색
        elif f[0] in columnBoard[r] and f[1] in columnBoard[r]:
            for c in range(5):
                if f[0] == columnBoard[r][c]:
                    idx = (c+1)%5
                    tmp[0] = columnBoard[r][idx]
                if f[1] == columnBoard[r][c]:
                    idx = (c+1)%5
                    tmp[1] = columnBoard[r][idx]
            result += (tmp[0]+tmp[1])
            break
    else:
        cnt = 0
        idxTmp = [[0, 0],[0, 0]]
        for r in range(5):
            for c in range(5):
                if f[0] == board[r][c]:
                    cnt += 1
                    idxTmp[0][0] = r
                    idxTmp[1][1] = c
                if f[1] == board[r][c]:
                    cnt += 1
                    idxTmp[1][0] = r
                    idxTmp[0][1] = c
                if cnt == 2:
                    result += (board[idxTmp[0][0]][idxTmp[0][1]]+board[idxTmp[1][0]][idxTmp[1][1]])
                    break
            if cnt == 2:
                break
print(result)

오답이 생긴 이유

행을 전부 검색하고 행이 아닌 경우 열을 검색 해야 하는데

행을 검색하면서 열도 같이 검색함

 

반례

X
PLAYFAIRCIPHERKEY

 

정답

ZZ

 

내 출력

YY

 

정답 코드

import sys
input = sys.stdin.readline
message = input().strip()
secretKey = input().strip()
fairKey = []
fair = ""

for idx in range(len(message)):
    if len(fair) == 2:
        fairKey.append(fair)
        fair = ""
    
    if fair == message[idx]:
        if fair == "X":
            fairKey.append(fair+"Q")
        else:
            fairKey.append(fair+"X")
        fair = message[idx]
    else:
        fair += message[idx]

    if idx == len(message) - 1:
        if len(fair) == 2:
            fairKey.append(fair)
        else:
            fair += "X"
            fairKey.append(fair)
    
board = [["" for _ in range(5)] for _ in range(5)]
alphabet = {
    "A": 0, "B": 0, "C": 0, "D": 0, "E": 0,
    "F": 0, "G": 0, "H": 0, "I": 0, "K": 0,
    "L": 0, "M": 0, "N": 0, "O": 0, "P": 0,
    "Q": 0, "R": 0, "S": 0, "T": 0, "U": 0,
    "V": 0, "W": 0, "X": 0, "Y": 0, "Z": 0
}
r_idx = 0
c_idx = 0
for alpha in secretKey:
    if alphabet[alpha]:
        continue
    alphabet[alpha] += 1
    board[r_idx][c_idx] = alpha
    c_idx += 1
    if c_idx == 5:
        c_idx = 0
        r_idx += 1

for alpha, number in alphabet.items():
    if number:
        continue
    board[r_idx][c_idx] = alpha
    c_idx += 1
    if c_idx == 5:
        c_idx = 0
        r_idx += 1

columnBoard = []
for c in range(5):
    tmp = []
    for r in range(5):
        tmp.append(board[r][c])
    columnBoard.append(tmp)

result = ""
for f in fairKey:
    tmp = ["", ""]
    for r in range(5):
        # 행 먼저 검색
        idx = 0
        if f[0] in board[r] and f[1] in board[r]:
            for c in range(5):
                if f[0] == board[r][c]:
                    idx = (c+1)%5
                    tmp[0] = board[r][idx]
                if f[1] == board[r][c]:
                    idx = (c+1)%5
                    tmp[1] = board[r][idx]
            result += (tmp[0]+tmp[1])
            break
    else:
        for r in range(5):
            if f[0] in columnBoard[r] and f[1] in columnBoard[r]:
                for c in range(5):
                    if f[0] == columnBoard[r][c]:
                        idx = (c+1)%5
                        tmp[0] = columnBoard[r][idx]
                    if f[1] == columnBoard[r][c]:
                        idx = (c+1)%5
                        tmp[1] = columnBoard[r][idx]
                result += (tmp[0]+tmp[1])
                break
        else:
            cnt = 0
            idxTmp = [[0, 0],[0, 0]]
            for r in range(5):
                for c in range(5):
                    if f[0] == board[r][c]:
                        cnt += 1
                        idxTmp[0][0] = r
                        idxTmp[1][1] = c
                    if f[1] == board[r][c]:
                        cnt += 1
                        idxTmp[1][0] = r
                        idxTmp[0][1] = c
                    if cnt == 2:
                        result += (board[idxTmp[0][0]][idxTmp[0][1]]+board[idxTmp[1][0]][idxTmp[1][1]])
                        break
                if cnt == 2:
                    break
print(result)

for else 구조를 통해서 break로 빠져나오지 못한 경우, 다시말해서 한 행에서 두 개의 문자를 찾지 못한 경우 else가 실행됩니다. else에서 다시 for else 구조를 통해서 한 열에서 두 개의 문자를 찾지 못한 경우 else가 실행됩니다. 따라서 1, 2, 3단계를 순차적으로 실행할 수 있게 됩니다.