아요 개발 일기

[프로그래머스] Level 1. 시저 암호 본문

Algorithms/문제 풀이

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

소진이 2023. 1. 17. 10:25

안녕하세요!!

요즘 날씨가 너무 좋네요 ㅎㅎㅎㅎㅎㅎ

오늘은 시저 암호 문제를 풀어보겠습니다 :D


문제

원래 문제 설명을 안 하지만! 

문제가 조금 헷갈리게 되어있어서 간단하게 적어보겠습니다.

대문자는 대문자로 소문자는 소문자로만 알파벳을 변경해야하고, 공백이 있으면 동일하게 들어가야합니다!

풀이

저는 문제를 보자마자 아 아스키코드를 사용해야겠구나! 라고 생각했어요ㅎㅎ

아래에 아스키 코드표 같이 첨부하겠습니다.

일단 문자열을 문자로 나누기 위해서 for문을 돌렸어요!

asciiValue를 통해서 문자의 아스키코드 숫자를 num 변수에 저장해주고,

문제 설명할때 말했듯이 대문자는 대문자로 소문자는 소문자로 변환해주워야한다했죠?

그래서 대문자 65~90, 소문자 97~122까지 switch case문으로 나누어줬습니다!

 

 num = (num + UInt8(n) - 65) % 26 + 65

이 코드는 따로 볼게요!

만약 num = 66이고 n = 2라면,

(66 + 2 - 65) % 26 + 65
= 3 % 26 + 65 
= 2 + 65
= 67 

 

왜 이렇게 복잡하게 식을 적었을까 생각이 드시는 분 있죠..?

처음에는 제가 case문 내부 코드를 아래와 같이 구성했었어요.

 

if num <= 90 {
	num = 65
}
num += UInt8(n)

 

근데 이렇게 하니까 마지막 z일때 즉 90 일때 그냥 넘어가더라구요..

그래서 고민하다가 num값에 n을 더해주고, 26개 문자를 나머지 연산으로 나누어 준 후에 65를 더해주니까 값이 문자만 잘 나왔습니다!

마지막 switch 문의 defalut 부분에 다른 문자가 들어왔을 시 " " Space bar가 들어가도록 설정해주면 끝! 

 

다른 풀이

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
    })
}

이건 저처럼 아스키코드를 사용하지 않고, alphabets String을 이용해서 풀었네요?

다소 어려운 분들은 이 글을 참고하면 보기 쉬울 것 같으니, String 관련 함수 글을 봐주세요!

 

map 함수는 문자열을 쪼개는 함수입니다.

일단 먼저 alphabets 상수를 "a", "b", "c" ....으로 쪼개 줍니다.

그 후, s 문자열도 map으로 쪼개 줍니다. (쪼개진 문자를 편의상 n이라고 부르겠습니다)

alphabets 문자열에 n을 소문자로 변환한 값과 같은 문자가 있는지 찾은 후, 해당 위치 번호 값을 index 변수에 저장해줍니다.

👉  firstIndex(of: ) : 문자열의 앞에서부터 원하는 인덱스의 위치를 찾아줌

👉 lowercased(of: ) : 소문자로 변환

 

letter 상수에 alphabets 문자열의 (index + n) % alphabets.count 번째 있는 문자를 넣어줍니다.

그리고, n 값이 대문자로 변환이 되면 letter값을 대문자로 안되면 letter값을 출력해줍니다.

 

 

어우,, 이해하는데 조금 걸렸어요 어렵네요ㅠㅠ 

이제 정확성 테스트 해봅시다!

 

정확성 비교

 

제가 푼 풀이

 

 

다른 풀이

오.. 제가 푼 풀이가 더 빠르네요?ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ헤헤

다른 풀이는 고차 함수랑 클로저를 써서 더 느려진건가봐요!!

어쨌든 많이 배우고 감니당 ㅎㅎㅎㅎ

오늘도 행복한 하루 보내세요 ❤️