• Home
  • About
    • Develop Woongs photo

      Develop Woongs

      make awesome woongs

    • Learn More
    • Facebook
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Algorithm-BOJ-11655

29 Jan 2019

Reading time ~1 minute

백준 (BOJ) 10808 ROT13

보안시간에 배웠던 카이사르의 이름을 따서 만든 시저암호에 대한 문제이다. 각 문자마다 특정 칸 만큼 이동시켜 만드는 암호문이다. ROT13은 시저 암호의 일종으로 13칸씩 이동시켜 26글자인 알파벳의 경우 두 번 적용하면 원래의 글자가 나오는 암호화와 복호화가 같은 암호화 방법이다.

사설은 이쯤하고 그래서 우리는 문제를 어떻게 해결해야 할 지 생각해보자.

사실 문제의 설명에서 답은 나와있다. 13칸씩 이동시키면 된다!! 이때 우리가 흔히 사용하는 ASCii 코드를 이용해서 풀면 되겠다.

근데 Swift에서는 아스키 코드를 어떻게 사용해야 하지…?

ASCII코드와 Unicode의 차이는 뭔지 어떻게 쓰는지 잘 모르겠다면 앞서 정리해둔 글을 참고하자.

아스키 코드로 A~Z는 65~90, a~z는 97~122 이기 때문에 우선 해당 문자가 아스키 코드인지 확인한 후 알파벳에 해당한다면 13을 더해 주고 더해서 해당 범위를 넘어선다면 % 를 사용하였다.

extension Character {
    var isAscii: Bool {
        return unicodeScalars.first?.isASCII == true
    }
    var ascii: UInt32? {
        return isAscii ? unicodeScalars.first?.value : nil
    }
}

if let str = readLine() {

    var newUInts: [UInt32] = []
    var newStrs = ""

    for c in str {
        if let uni = c.ascii {
            if uni >= 97 && uni <= 122 {
                let newUni = uni + 13
                newUInts.append(newUni > 122 ? 97 + (newUni % 123) : newUni)
            } else if uni >= 65 && uni <= 90 {
                let newUni = uni + 13
                newUInts.append(newUni > 90 ? 65 + (newUni % 91) : newUni)
            } else {
                newUInts.append(uni)
            }
        }
    }

    for i in newUInts {
        if let str = UnicodeScalar(i) {
            newStrs += String(str)
        }
    }

    print(newStrs)
}

더 간단하게 하는 방법이 있을 것 같은데.. swift로 이 문제를 푼 사람은 아직 나뿐이라서 아직은 잘 모르겠다. 추후 공부하고 성장해서 지금 이 글을 다시보면 부끄러워질 날이 오길…



swiftAlgorithmBOJ문자열 처리 Share Tweet +1