본문 바로가기
Algorithm Problem Solving/BaekJoon

[BaekJoon] 백준 2999 비밀 이메일 (Python / 파이썬)

by ʚ⇜❅🎕̈❄⇝ɞ 2021. 8. 22.
728x90
반응형

BaekJoon 백준 2999 비밀 이메일 문제는 정인이는 상근이에게 이메일을 보내는데 자신의 이메일이 해킹당할 수도 있다는 생각에, 암호 알고리즘을 사용하여 내용을 항상 암호화해서 보낸다. 정인이의 암호 이메일이 주어졌을 때, 이를 해독하는 문제이다. 난이도는 Bronze 1이다.

 

BaekJoon 2999 비밀 이메일 문제 정보

출처

- https://www.acmicpc.net/problem/2999

알고리즘 분류

- 문자열 string, 구현

난이도

- 브론즈 1 / Bronze 1

 

비밀 이메일 문제 요약

  • 정인이는 자신의 이메일이 해킹당할 수도 있다는 생각에, 내용을 항상 암호화해서 보낸다.
  • 정인이가 사용하는 암호 알고리즘은 다음과 같다. 정인이가 보내는 메시지는 총 N글자이다. 메시지는 알파벳 소문자로만 이루어져 있고, 최대 100글자이다.
    1. 정인이는 R <=C이고, R*C=N인 R과 C를 고른다. 만약, 그러한 경우가 여러 개일 경우, R이 큰 값을 선택한다.
    2. 그다음, 행이 R 개고, 열이 C개인 행렬을 만든다.
    3. 이제 메시지를 행렬에 옮긴다. 첫 번째 행의 첫 번째 열부터 C번째 열까지 메시지를 순서대로 옮긴 뒤, 남은 메시지는 두 번째 행, 세 번째 행,... R번째 행에 첫 번째 행을 채운 방법과 동일한 순서대로 옮긴다.
    4. 행렬에 모두 메시지를 옮겼다면, 이 것을 첫 번째 열의 첫 번째 행부터 R번째 행까지 차례대로 읽으면서 다시 받아 적는다. 그다음에, 두 번째 열, 세 번째 열,..., C번째 열에 쓰여 있는 문자를 첫 번째 열을 읽은 방법과 동일하게 받아 적는다.
  • 정인이의 암호 이메일이 주어졌을 때, 이를 해독하여 출력한다.

 

문제 풀이 과정

  1. 메시지의 글자 수를 구하고, 약수를 구한다.
  2. 약수의 개수가 짝수면 중간 위치의 값 2개를, 홀수면 중간 값 1개를 모두 R C에 저장한다.
  3. 첫 번째 열의 첫 번째 행부터 R번째 행까지 메시지를 순서대로 옮긴 뒤 C번째 열 까지 반복하여 저장한다.
  4. 행렬에 저장된 메시지를 첫 번 째 행의 첫 번째 열부터 C번 째 열 까지 순서대로 출력하고 R번 째 행까지 반복하여 출력한다.

 

코드 및 설명
  • divisor [] - N의 약수 저장 리스트
  • arr [] - 행렬
  • idx - 메시지의 글자 위치
  • column - i번 째 열의 글자들
msg = input()
N = len(msg)

# R, C 구하기 (약수)
divisor = []
for i in range(1, N + 1):
    if N % i == 0:
        divisor.append(i)

divisorLen = len(divisor)
if divisorLen % 2 == 0:
    R = divisor[divisorLen // 2 - 1]
    C = divisor[divisorLen // 2]
else:
    R = C = divisor[divisorLen // 2]

# 첫 번째 열의 첫 번째 행부터 R번째 행까지 메시지를 순서대로 옮긴 뒤 C 번째 열 까지 반복
arr = []  # 행렬
idx = 0  # 메세지의 글자 위치
for i in range(C):
    column = [0] * R  # i번 째 열의 글자를 저장
    for j in range(R):
        column[j] = msg[idx]
        idx += 1
    arr.append(column)

# 행렬의 메세지를 행 순서대로 읽어 해독
for i in range(R):
    for j in range(C):
        print(arr[j][i], end='')

BaekJoon 백준 2999 비밀 이메일 문제를 파이썬 python으로 풀어보았다. 문자열에 대한 문제로 난이도는 Bronze 브론즈 1이다. 

728x90
반응형

댓글