https://www.acmicpc.net/problem/2999
문제
매일 밤, 정인이는 상근이에게 이메일을 보낸다. 정인이는 자신의 이메일이 해킹당할 수도 있다는 생각에, 내용을 항상 암호화해서 보낸다.
정인이가 사용하는 암호 알고리즘은 다음과 같다. 정인이가 보내는 메시지는 총 N글자이다.
먼저, 정인이는 R<=C이고, R*C=N인 R과 C를 고른다. 만약, 그러한 경우가 여러 개일 경우, R이 큰 값을 선택한다.
그 다음, 행이 R개고, 열이 C개인 행렬을 만든다.
이제 메시지를 행렬에 옮긴다. 첫 번째 행의 첫 번째 열부터 C번째 열까지 메시지를 순서대로 옮긴 뒤, 남은 메시지는 두 번째 행, 세 번째 행,... R번째 행에 첫 번째 행을 채운 방법과 동일한 순서대로 옮긴다.
행렬에 모두 메시지를 옮겼다면, 이 것을 첫 번째 열의 첫 번째 행부터 R번째 행까지 차례대로 읽으면서 다시 받아 적는다. 그 다음에, 두 번째 열, 세 번째 열,..., C번째 열에 쓰여 있는 문자를 첫 번째 열을 읽은 방법과 동일하게 받아적는다.
상근이는 매일 밤 정인이의 메시지를 해독하는데 지쳤다. 정인이의 암호 이메일이 주어졌을 때, 이를 해독하는 프로그램을 작성하시오.
예제 입력
정인이는 원래 "bombonisuuladici"를 보내려고 했다. 이 메시지는 16글자이므로, 정인이는 1*16, 2*8, 4*4 행렬을 선택할 수 있다. R이 가장 큰 것은 4*4이므로, 4*4를 선택한다.
정인이가 만든 행렬은 다음과 같을 것이다.
b | o | m | b |
o | n | i | s |
u | u | l | a |
d | i | c | i |
문제 코드
문제 풀이
이메일을 string과 문자열의 행과 열을 담당할 R,C , 이메일을 변형할 arr배열을 선언함. 그 후 이메일 n을 입력 받고 n의 길이만큼 반복되는 for문과 if문을 사용하여 n의 길이를 1부터 시작하여 1씩 더하는 값, 즉 i로 나눠줌. 그때 나머지가 0이고 나눈 값이 i보다 크다면 (R<=C 조건 충족, 등호 기호를 빼먹어서 시간을 허비함.) if문을 사용하여 n의 길이를 i로 나눈 값이 전에 저장된 R값보다 큰지 확인함.(조건을 충족하는 R,C가 여러개인 경우 R이 더 큰 R,C의 조합을 사용해야 하는 조건 충족) 모두 확인됐다면 R에는 i값이 저장되고 C에는 n의 길이를 i로 나눈 값이 저장됨. 그 후 for문을 사용하여 arr배열에 1행1열부터 2행1열 3행 1열 ... 순으로 이메일 n의 문자가 입력됨. 그 후 for문을 사용하여 arr[R][C]에 맞게 1행 1열부터 1행 2열 ...순서대로 출력하였음.
'Koala - 9기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[백준 / Python] #7795 먹을 것인가 먹힐 것인가 (0) | 2023.02.02 |
---|---|
[백준/C++] 1018번 체스판 다시 칠하기 (0) | 2023.02.02 |
[BOJ/C] 2947 나무 조각 (0) | 2023.01.30 |
[BOJ/C] 2789 유학 금지 (0) | 2023.01.30 |
[백준/Python] 10773번 제로 (1) | 2023.01.30 |