Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바스크립트
- Lv. 0
- 너비 우선 탐색
- softeer
- dfs
- C언어
- SQL 고득점 KIT
- 프로그래머스
- 동적계획법
- LEVEL 2
- select
- SQL
- programmers
- Java
- 깊이 우선 탐색
- Lv. 2
- level 3
- join
- Dynamic Programming
- javascript
- DP
- Lv. 3
- 소프티어
- Python
- 오블완
- group by
- Lv. 1
- 티스토리챌린지
- bfs
- 파이썬
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
Softeer level3 [HSAT 3회 정기 코딩 인증평가 기출] 플레이페어 암호 Python 본문
문제 링크 : https://softeer.ai/practice/info.do?idx=1&eid=804
오답 코드
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단계를 순차적으로 실행할 수 있게 됩니다.
'알고리즘' 카테고리의 다른 글
Softeer level3 [21년 재직자 대회 예선] 좌석 관리 Python (0) | 2023.08.26 |
---|---|
Softeer level3 [21년 재직자 대회 본선] 코딩 테스트 세트 Python (0) | 2023.08.23 |
Softeer level3 스마트 물류 Python (0) | 2023.08.07 |
Softeer level3 택배 마스터 광우 Python (0) | 2023.08.04 |
Softeer level2 [21년 재직자 대회 예선] 비밀 메뉴 Python (0) | 2023.07.29 |