본문 바로가기
Problem Solving

[Swift] 프로그래머스 시저 암호(lv. 1)

by DuncanKim 2023. 1. 13.
728x90

[Swift] 프로그래머스 시저 암호(lv. 1)

 

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

2. 접근

영어 대, 소문자, 공백밖에 없기 때문에 AsciiValue를 사용하면 되겠다는 생각을 했다.

대문자 A가 asciiValue int로 65이고, 소문자 a가 97이기 때문에, 이 수를 빼서 생각하면 되고, 나머지 공백은 -1로 하여 별도로 처리하면 되겠다는 생각을 했다.

 

아래 코드의 반복문에서는 input을 순환하여 돌면서 한 글자마다 uppercase인지 lowercase인지 확인을 해준다. 둘다 아닐 경우 answer 배열에 " "를 넣어준다.

 

n은 옆으로 밀 숫자인데, 현재 temp(asciiValue에서 특정 숫자를 뺀 수)에서 n을 더하면 그 자리의 숫자가 나온다. 여기에서 25를 초과하면 다시 0으로 넘어가야 하는데, 삼항연산자가 이 기능을 한다.

 

n만큼 이동한 후의 값을 찾아 temp에 넣어주고, 다시 uppercase이면 65를 더해주고, lowercase면 97을 더해주고 Character로 바꾸어 answer 배열에 넣어준다.

 

반복문을 모두 순회하면, 공백을 포함한 문자들이 answer에 들어가있고, 이것을 다시 String으로 바꾸어 리턴하면 끝.

 

asciivalue를 적재적소에 활용할 줄 알면 금방 푸는 문제이다.

 

3. 코드

import Foundation

func solution(_ s:String, _ n:Int) -> String {
    let input = s
    var answer = [Character]()
    
    for i in input {
        var temp = i.isUppercase ? Int(i.asciiValue!) - 65 : i.isLowercase ? Int(i.asciiValue!) - 97 : -1
        if temp == -1 {
            answer.append(" ")
            continue
        }
        temp = temp + n > 25 ? (temp + n - 26) : temp + n
        if i.isUppercase {
            answer.append(Character(String((UnicodeScalar(temp + 65)!))))
        } else {
            answer.append(Character(String((UnicodeScalar(temp + 97)!))))
        }
    }
    return String(answer)
}
728x90

댓글