728x90
반응형
문제 : https://softeer.ai/practice/info.do?idx=1&eid=804&sw_prbl_sbms_sn=78635
Softeer
연습문제를 담을 Set을 선택해주세요. 취소 확인
softeer.ai
풀이 내용 :
#0. 주어진 키를 5x5 표로 변환하기
#1. 주어진 문자열을 분할 및 암호화
#1-1. 주어진 문자열 두글자씩 나누기
#1-2. 글자쌍 규칙 적용
#2. 순서대로 규칙 확인해보면서 적용
#2-1. 같은 행에 있는지 확인해보기
#2-2. 같은 열에 잇는지 확인해보기
#2-3. 각 암호화 문자의 위치 스위칭 해주기
#문제 코딩 순서
#0. 주어진 키를 5x5 표로 변환하기
#아웃풋 확인
#1. 주어진 문자열을 분할 및 암호화
#1-1. 주어진 문자열 두글자씩 나누기
#1-2. 글자쌍 규칙 적용
# 아웃풋 확인
#2. 순서대로 규칙 확인해보면서 적용
#2-1. 같은 행에 있는지 확인해보기
#2-2. 같은 열에 잇는지 확인해보기
#2-3. 각 암호화 문자의 위치 스위칭 해주기
def show_maps():
global maps
for i in range(5):
for j in range(5):
print(maps[i][j],end=' ')
print()
#0
#
input_msg = input()
input_key = input()
# input_msg = "HELLOWORLD"
# input_key = "PLAYFAIRCIPHERKEY"
alphabets = ["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"]
alpha_dict = {}
location_alpha = {}
for i in alphabets:
alpha_dict[i]=0
for i in alphabets:
location_alpha[i]=(0,0)
maps = [[0 for _ in range(5)] for _ in range(5)]
input_alphabets = [i for i in input_key]
row_idx = 0
col_idx =0
for i in input_alphabets:
if(col_idx>=5):
col_idx=0
row_idx+=1
if(alpha_dict[i]==0):
maps[row_idx][col_idx]=i
alpha_dict[i]+=1
col_idx+=1
for i in alphabets:
if(col_idx>=5):
col_idx=0
row_idx+=1
if(alpha_dict[i]==0):
maps[row_idx][col_idx]=i
alpha_dict[i]+=1
col_idx+=1
for i in range(5):
for j in range(5):
location_alpha[maps[i][j]]=(i,j)
#1. 주어진 문자열 분해 및 암호화
msg_list = [i for i in input_msg]
ciphers = []
while(True):
if(len(msg_list)==0):
break
#문제가 없는 경우
elif(len(msg_list)==1):
ciphers.append([msg_list[-1],'X'])
break
else:
if(msg_list[0]!=msg_list[1]):
ciphers.append([msg_list[0],msg_list[1]])
msg_list = msg_list[2:]
else:
if(msg_list[0]=='X' and msg_list[1]=="X"):
ciphers.append([msg_list[0],'Q'])
else:
ciphers.append([msg_list[0],'X'])
msg_list = msg_list[1:]
#2. 순서대로 규칙 적용하면서 암호화
ans=[]
for idx in ciphers:
a,b = idx
a_idx = location_alpha[a]
b_idx = location_alpha[b]
#같은 행에 있는가?
if(a_idx[0]==b_idx[0]):
if(a_idx[1]+1>=5):
ans.append(maps[a_idx[0]][0])
else:
ans.append(maps[a_idx[0]][a_idx[1]+1])
if(b_idx[1]+1>=5):
ans.append(maps[b_idx[0]][0])
else:
ans.append(maps[b_idx[0]][b_idx[1]+1])
#같은 열에 있는가?
elif(a_idx[1]==b_idx[1]):
if(a_idx[0]+1>=5):
ans.append(maps[0][a_idx[1]])
else:
ans.append(maps[a_idx[0]+1][a_idx[1]])
if(b_idx[0]+1>=5):
ans.append(maps[0][b_idx[1]])
else:
ans.append(maps[b_idx[0]+1][b_idx[1]])
else:
ans.append(maps[a_idx[0]][b_idx[1]])
ans.append(maps[b_idx[0]][a_idx[1]])
res =''
for c in ans:
res +=c
print(res)
느낀 점
- Softeer에서 제공해주는 난이도는 별3개의 난이도이다. 그런데 다른 난이도3개 짜리 문제랑 비교해보면 어렵지는 않앗던 것 같다. 다만 어렵지 않은 이유는 킹갓파이썬으로 풀었기 때문이다. 문제를 풀이 과정을 보면 2차원 배열, 문자열 처리가 핵심적으로 사용되었는데 사실 C++로 똑같이 짜려고 하면 골치가 조금 아프긴 하기 때문이다. 확실히 킹갓파이썬이 직관적으로 사용하기는 편하다.
- Softeer는 현대그룹에서 코딩을 위해 운영하는 홈페이지인데 현대그룹 코딩테스트를 준비하기 유용하다. 하지만 나는 워낙 백준에 익숙해져있기 때문에 문제 스타일이나 에디터가 무척 낯설긴 하다. 특히 문제는 삼성 기출이나 다른 백준의 문제와는 사뭇 다르다. 읽으면서 뭐지 이건? 하는 물음표들이 종종 나오는데 문제 예시에 대한 설명과 채점과정도 좀 직관적으로 바뀌었으면 하는 바람이다. ( 문제 예시와 채점 과정은 확실히 백준이 최고인 듯 하다. 문제 풀 맛이 난다.)
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
Softeer [인증평가(4차) 기출] 통근버스 출발 순서 검증하기 (Python) (1) | 2022.09.22 |
---|---|
Softeer [인증평가(4차) 기출] 슈퍼컴퓨터 클러스터 (Python) (2) | 2022.09.22 |
[백준] 14503 - 로봇 청소기 (Python) (C++) (0) | 2021.07.19 |
[백준] 14502 - 연구소 (Python) (0) | 2021.07.19 |
[프로그래머스] 순위 검색 (Level2) (Python) (0) | 2021.07.11 |