본문 바로가기

엑셀 컬럼명 암호?

 

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

https://t0pli.tistory.com/146

에서 풀었던 문제를 응용했다.

원래 문제는 숫자에 대응하는 엑셀 컬럼명을 구하는 건데 하는 김에 반대로 주어진 컬럼명이 몇 번째 컬럼인지도 구해봤다. 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