티스토리 뷰

728x90

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

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr

 

 

 

내 풀이 

못 푼 문제

 

못 푼 문제는 주말에 복습!

 

다른사람의 풀이

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

}

solution("aBaSaB", 1)

 

풀이

더보기

1. 알파벳을 문자열로 배열한뒤 map으로 하나씩 정렬 합니다.

2. 파라미터 s의 값이 비었을 경우 guard let 으로 ""를 반환하게 걸러줍니다.

3. 파라미터 s의 전체값을 소문자로 바꾸고 (lowercased()) map으로 하나씩 순회하며 alphabets.firstIndex(of:)로 해당 index      를 가져와 저장 합니다.

4. z 이후에 다시 a 부터 시작해야 하므로 [(index + n) % alphabets.count] 로 처음으로 돌아갈 수 있게 조절해줍니다.

5. s에 대문자가 있다면 (isUppercase) 해당 부분은 대문자로 바꿔주고 (.uppercased()) 소문자면 소문자로 반환해줍니다.

 

배운것

firstIndex(of:)

(of: element) element에 일치하는 값의 index를 반환 합니다.

 

 

예제

var students = ["Ben", "Ivy", "Jordell", "Maxime"]

// element에 일치하는 값이 있는지 확인 (if let) 
// 있으면: i = 일치하는 값의 index
// 없으면: pass
if let i = students.firstIndex(of: "Maxime") {
// i = 3
    students[i] = "Max"
}
print(students)
// Prints "["Ben", "Ivy", "Jordell", "Max"]"

 

728x90