알고리즘 - 프로그래머스 시저 암호(Swift)

2020. 7. 20. 14:29Algorism

반응형

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

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

입출력 예

snresult

AB 1 BC
z 1 a
a B z 4 e F d

 


네 문자열 처리에 대한 문제입니다.

 

해결 방법으로는 여러가지가 있겠지요..?

 

1. 아스키 코드를 이용한 방법

2. Array를 이용한 방법

 

저는 Array를 이용한 방법으로 진행하였어요. 풀이방법은 아래와 같습니다.

 

1. 대문자 배열을 선언한다.

2. 입력받은 문자열을 map함수를 사용하여 한개식 문자를 꺼내서 비교한다.

3. 분리된 문자를 대문자로 변경이후 미리 선언해둔 대문자 배열에 포함되는지 여부를 파악한다. (포함시 해당 인덱스 번호를 가지고 온다.)

4. 포함 되지 않을 경우 바로 반환한다.

5. 포함되었을 경우 미리 선언한 대문자배열의 지정된 인덱스 번호의 문자를 꺼낸다.

    - 지정된 인덱스 번호 = (조금전 꺼내둔 인덱스 번호 + n만큼 이동시킬 숫자) % 26으로 나눈 나머지 (대문자 배열 갯수)

6. 현재 분리된 문자가 대문자인지 체크하여 대문자가 아닐경우에는 소문자로 변환하여 반환한다.

7. map함수를 사용하여 반환받은 Array값을 String으로 형변환 해주어 반환한다.

import Foundation

func solution(_ s:String, _ n:Int) -> String {
    let alphabet = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ")

    return String( s.map {
        guard let index = alphabet.firstIndex(of: Character($0.uppercased()) ) else {
            return $0
        }
        let result = alphabet[(index + n) % alphabet.count]
        return  $0.isUppercase ? result : Character(result.lowercased())
    })
}

print("result = \(solution("a B z",4))")
반응형