1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import java.math.BigInteger;
public class Q004 {
public static void main(String[] args) {
System.out.println(digitsToAscii(39574640)); //CHOPIN
}
public static String digitsToAscii(long n) {
StringBuilder sb = new StringBuilder();
do {
char c = (char)('A' + (26L + (n%26L) - 1L)%26L);
sb.append(c);
if(c == 'Z') --n;
} while((n /= 26L) > 0);
return sb.reverse().toString();
}
public static String asciiToDigits(String str) {
if(!str.matches("[A-Z]+")) { return "-1"; }
BigInteger res = BigInteger.ZERO;
BigInteger j = BigInteger.ONE;
for(int i = str.length() - 1; i >= 0; j = j.multiply(BigInteger.valueOf(26L)), i--) {
res = res.add(BigInteger.valueOf(str.charAt(i) - 'A' + 1).multiply(j));
}
return res.toString();
}
}
|
cs |
에서 풀었던 문제를 응용했다.
원래 문제는 숫자에 대응하는 엑셀 컬럼명을 구하는 건데 하는 김에 반대로 주어진 컬럼명이 몇 번째 컬럼인지도 구해봤다. 8행부터 17행이 전자, 19행부터 30행이 후자에 해당한다.
엑셀 컬럼명은 알파벳으로 이루어져 있으니까 간단한 유사 암호문 정도로는 써먹을 수 있지 않을까 싶다.
연설문처럼 길고 띄어쓰기 없이 내용이 파악이 안 되는 경우는 무리일 것 같고, 문장 한두 개 정도는 암호화할 수 있지 않을까? 띄어쓰기나 따옴표같은 특수한 문자는 따로 잘 처리하면 꽤 긴 내용도 가능하지 싶다. 시간을 더 잡아먹긴 하겠지만..
asciiToDigits 메소드는 Encryption, digitsToAscii 메소드는 Decryption에 해당한다.
5행의 39574640은 쇼팽(CHOPIN)을 암호화한 것이다. 즉 digitsToAscii(39674640)의 반환값은 "CHOPIN"이고, asciiToDigits("CHOPIN")의 반환값은 39674640이다.
'Programming > 과제' 카테고리의 다른 글
재귀함수를 이용한 최소공배수 구하기 (0) | 2021.03.08 |
---|---|
재귀함수를 이용한 최대/최소값 구하기 (0) | 2021.03.08 |
홀짝 판별 (0) | 2021.01.17 |
[과제] 수강신청 프로그램 (0) | 2019.07.04 |
피보나치 수열 (0) | 2019.06.17 |