[프로그래머스] Lv.1 시저암호 Swift

DevelopRecord·2022년 6월 23일
0

Algorithm

목록 보기
5/5

오늘은 프로그래머스 Lv.1 시저 암호에 대해 설명해 볼게요.
테스트케이스 9번 제외하고 다 오류나서 뭐가 잘못됐는지 헤맸네요..

문제링크

문제설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

제한조건

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

입출력 예

코드

func solution(_ s: String, _ n: Int) -> String {
    var asciiStr = String() // 리턴할 변수

    for char in s { // 문자열 s를 for문으로 돌림
        if char == " " { // 만약 char이 " " 공백이라면
            asciiStr.append(" ") 리턴할 변수에 공백 추가
            continue
        } else { // 아니라면
            if char.asciiValue! >= 97 && char.asciiValue! <= 122 { // 소문자 조건
                let lowerAscii = Character("a").asciiValue! // 소문자 a 아스키 값
                var value = char.asciiValue! - lowerAscii + UInt8(n)
                var character = String()

                if value > 25 { // 25가 넘으면
                    value -= 26
                }

                character = String(UnicodeScalar(lowerAscii + value)) // 아스키코드를 문자로
                asciiStr.append(character) // 반환할 문자열에 문자 추가

                character = "" // 값 초기화
                value = 0 // 값 초기화

            } else if char.asciiValue! >= 65 && char.asciiValue! <= 90 { // 대문자
                let upperAscii = Character("A").asciiValue!
                var value = char.asciiValue! - upperAscii + UInt8(n)
                var character = String()

                if value > 25 {
                    value -= 26
                }

                character = String(UnicodeScalar(upperAscii + value))
                asciiStr.append(character)

                character = ""
                value = 0
            }
        }
    }

    return asciiStr
}

제가 썼지만 그리 좋은 코드는 아닌 것 같아요.

value 변수가 만약에 25를 넘는다? 이때는 이런 상황이겠죠.

예를 들어 매개변수 s에 y라는 문자열이 들어갔고, 매개변수 n은 2가 들어갔다 가정해요.
이때 y의 아스키코드는 24고 여기서 n만큼 이동하면 26이 나오는데,
아스키코드 26은 { 입니다.
따라서 우리는 value가 25가 넘었을 때 26을 빼주면 됩니다.

문자열 s에 공백이 있거나 방금 예시처럼 value값이 25가 넘을 때의 조건문만 잘 작성하시면 쉽게 풀릴 것 같아요.

위 코드보다 더 좋은 방법도 많으니까 제 코드는 참고용으로만 봐주세요.

0개의 댓글