Archive/Questions

[programmers/Swift] 시저 암호

Marco 2022. 4. 28. 19:39
728x90

programmers.co.kr - 코딩테스트연습 - Lv.1 - 연습문제 - 시저 암호

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr

Constraints :

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

 

Solution.swift :

//
//  Created by Yongwoo Marco on 2022/04/28.
//  Copyright © 2022 Yongwoo Marco Kim. All rights reserved.
//

func solution(_ s:String, _ n:Int) -> String {
    let values = (a: Character("a").asciiValue!, z: Character("z").asciiValue!,
                  A: Character("A").asciiValue!, Z: Character("Z").asciiValue!)
    let ranges = (lowercase: values.a...values.z,
                  uppercase: values.A...values.Z)
    return s.map { char in
        if char == " " {
            return String(char)
        } else {
            let value = char.asciiValue!
            var sum = value + UInt8(n)
            if ranges.lowercase ~= value && sum > values.z {
                sum = sum - values.z + values.a - 1
            } else if ranges.uppercase ~= value && sum > values.Z {
                sum = sum - values.Z + values.A - 1
            }
            
            return String(Character(UnicodeScalar(sum)))
        }
    }.joined()
}

How I tried this :
a, z, A, Z 문자의 아스키 값을 받고 각 문자가
소문자인지 대문자인지에 따라서 

옮겨진 값이 z 또는 Z를 넘어가는 경우 다시 a 로 넘어가도록 처리

나머지 경우는 n 만큼 옮겨진 값을 다시 문자로 변환

문제에 관한 모든 저작권 : https://programmers.co.kr/

728x90