[Programmers] [Lv.1] [Swift] 시저 암호

doyeonjeong_·2022년 7월 27일
0

프로그래머스

목록 보기
11/35

문제

시저 암호

풀이

func solution(_ s:String, _ n:Int) -> String {
    var answer = ""
    let input = Array(s)
    let uppercases = Array("abcdefghijklmnopqrstuvwxyz".uppercased())
    let lowercases = Array("abcdefghijklmnopqrstuvwxyz")
    
    for x in input {
        // 공백
        if x == " " { answer += " " }
        // 대문자
        else if x.isUppercase == true {
            var idx = uppercases.firstIndex(of: x)! + n
            // uppercases 배열 길이(25) 초과시 - 26으로 초기화
            if idx > 25 { idx -= 26 }
            // 해당 인덱스 값을 answer 에 추가
            answer.append(uppercases[idx])
        }
        // 소문자
        else {
            var idx = lowercases.firstIndex(of: x)! + n
            if idx > 25 { idx -= 26 }
            answer.append(lowercases[idx])
        }
    }
    return answer
}

🤔 FEEDBACK

  • 비트 연산자로 풀려고 했다가 이론 접하고 이게 맞나? 싶었다.
  • 그 다음 아스키코드로 풀려다가 로직은 맞는데 계속 오류가 났다.
  • 그래서 그냥 배열로 만들어 풀었다. 그것도 힌트보고 ... 🥲

다른 풀이

func solution(_ s:String, _ n:Int) -> String {
    return s.utf8.map {
        var code = Int($0)
        switch code {
            case 65...90:
                code = (code + n - 65) % 26 + 65
            case 97...122:
                code = (code + n - 97) % 26 + 97
            default:
                break
        }
        return String(UnicodeScalar(code)!)
    }.joined()
}
  • 내가 하려던 방식이 이건데 .. switch case 를 왜 생각못했지?😮
  • code >= 122code >= 90의 범위가 같아서 애먹었는데 이런방법이..
func solution(_ s:String, _ n:Int) -> String {
    let alphabets = "abcdefghijklmnopqrstuvwxyz".map { $0 }
    return String(s.map {
        guard let index = alphabets.firstIndex(of: Character($0.lowercased())) else { return $0 }
        let letter = alphabets[(index + n) % alphabets.count]
        return $0.isUppercase ? Character(letter.uppercased()) : letter
    })
}
  • 와 이건 또 뭐야..!
  • print(alphabets) 해보니까 Array()하고 똑같은 결과나왔다.
  • 가독성은 떨어지지만 시간복잡도나 메모리는 비슷한 것 같다.
profile
블로그 이사중 🚚 byukbyak.tistory.com

0개의 댓글