문제 출처 : https://www.acmicpc.net/problem/2999
언어 : Kotlin
문제 설명 :
매일 밤, 정인이는 상근이에게 이메일을 보낸다. 정인이는 자신의 이메일이 해킹당할 수도 있다는 생각에, 내용을 항상 암호화해서 보낸다.
정인이가 사용하는 암호 알고리즘은 다음과 같다. 정인이가 보내는 메시지는 총 N글자이다.
먼저, 정인이는 R<=C이고, R*C=N인 R과 C를 고른다. 만약, 그러한 경우가 여러 개일 경우, R이 큰 값을 선택한다.
그 다음, 행이 R개고, 열이 C개인 행렬을 만든다.
이제 메시지를 행렬에 옮긴다. 첫 번째 행의 첫 번째 열부터 C번째 열까지 메시지를 순서대로 옮긴 뒤, 남은 메시지는 두 번째 행, 세 번째 행,... R번째 행에 첫 번째 행을 채운 방법과 동일한 순서대로 옮긴다.
행렬에 모두 메시지를 옮겼다면, 이 것을 첫 번째 열의 첫 번째 행부터 R번째 행까지 차례대로 읽으면서 다시 받아 적는다. 그 다음에, 두 번째 열, 세 번째 열,..., C번째 열에 쓰여 있는 문자를 첫 번째 열을 읽은 방법과 동일하게 받아적는다.
상근이는 매일 밤 정인이의 메시지를 해독하는데 지쳤다. 정인이의 암호 이메일이 주어졌을 때, 이를 해독하는 프로그램을 작성하시오.
입력 :
첫째 줄에 상근이가 받은 메시지가 주어진다. 이 메시지는 알파벳 소문자로만 이루어져 있고, 최대 100글자이다.
출력 :
첫째 줄에 상근이가 받은 메시지를 해독한 메시지를 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
bok | bok |
koaski | kakosi |
boudonuimilcbsai | bombonisuuladici |
풀이 :
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val input = readLine()
val rcArr = IntArray(2) { 0 }
(1 .. input.length).forEach { r ->
for (c in r .. input.length) {
if (r * c == input.length) rcArr.also { it[0] = r; it[1] = c }
}
}
val sb = StringBuilder()
val passwordArr = input.chunked(rcArr[0])
for (i in 0 until rcArr[0]) {
for (j in 0 until rcArr[1]) {
sb.append(passwordArr[j][i])
}
}
bw.write(sb.toString())
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
13985번: Equality (0) | 2024.02.19 |
---|---|
6378번: 디지털 루트 (0) | 2024.02.16 |
27889번: 특별한 학교 이름 (0) | 2024.02.16 |
2153번: 소수 단어 (1) | 2024.02.15 |
3029번: 경고 (0) | 2024.02.14 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!