문제
https://www.acmicpc.net/problem/2999
2999번: 비밀 이메일
정인이는 원래 "bombonisuuladici"를 보내려고 했다. 이 메시지는 16글자이므로, 정인이는 1*16, 2*8, 4*4 행렬을 선택할 수 있다. R이 가장 큰 것은 4*4이므로, 4*4를 선택한다. 정인이가 만든 행렬은 다음과
www.acmicpc.net
문제 설명
암호 이메일이 주어졌을 때, 해독하는 프로그램을 작성한다.
암호이메일을 만드는 방법은
1. 문자열을 입력 받고 조건에 따른 R, C를 찾는다.
조건 1. R <= C
조건 2. R * C = N
+ 조건에 부합하는 경우가 여러 개인 경우, R이 큰 값을 선택한다.
2. 행이 R개이고, 열이 C개인 행렬을 만들고 메세지를 첫 번째 열부터 다시 옮겨 적는다.
코드
import sys
input = __import__('sys').stdin.readline
def main():
string = input().rstrip()
R = 0 # 가로 줄
C = 0 # 세로 줄
leng = len(string) # 문자열의 길이
# 조건에 부합하는 R, C 찾기
for i in range(1, leng + 1):
if leng % i == 0 and i <= leng // i:
R, C = i, leng // i
# 문자열을 담을 행렬 (2차원 리스트)
arr = [[] for _ in range(C)]
idx = 0
# 행렬에 문자열 담기
for i in range(C):
for j in range(R):
arr[i].append(string[idx])
idx += 1
# 다시 담을 문자열
res = ''
# 문자열에 저장하기
for i in range(R):
for j in range(C):
res += arr[j][i]
print(res)
if __name__ == "__main__":
main()
그림을 그려보며 차례대로 코드를 작성했다.
1. 조건에 부합하는 R, C를 찾는다.
2. 행이 R개, 열이 C개인 행렬(리스트)을 작성하고 행렬에 문자열을 차례대로 담는다.
3. 열을 고정시키고 행을 증가시키면서 접근한 문자를 문자열에 다시 담고 출력한다.
'Algorithm Problems > 구현' 카테고리의 다른 글
[백준/Python] 17300번: 패턴 (1) | 2024.01.06 |
---|---|
[백준/Python] 23349번: 졸업 사진 (0) | 2024.01.01 |
[백준/Python] 1969번: DNA (1) | 2023.11.20 |
[백준/Python] 1408번: 24 (2) | 2023.10.10 |
[백준/python] 2852번: NBA 농구 (2) | 2023.08.01 |