[프로그래머스] 시저 암호 - Swift

이창형·2023년 2월 25일
0

코드

func solution(_ s:String, _ n:Int) -> String {
	// 답을 적을 String
    var answer = String()
    
    // 알파벳을 dic에 인덱스와 함께 저장
    let alphabet = ["A":0,"B":1,"C":2,"D":3,"E":4,"F":5,"G":6,"H":7,"I":8,"J":9,"K":10,"L":11,"M":12,"N":13,"O":14,"P":15,"Q":16,"R":17,"S":18,"T":19,"U":20,"V":21,"W":22,"X":23,"Y":24,"Z":25]
    
    // key만 있는 배열 생성
    let keys = alphabet.keys.sorted()
   	
	// String인 s를 배열로 만들어 하나하나 씩 뽑음
    for i in 0..<Array(s).count{
    	// 공백일시 answer에 공백 추가하고 continue
        if Array(s)[i] == " "{
            answer += " "
            continue
        }
        	// dic에 저장한 알파벳들이 대문자여서 Array(s)의 알파벳도 대문자로 변경 후 n만큼 뒤에 있는 알파벳을 적어줘야하니 n을 더한다 (알파벳에서 Array(s)에 있는 알파벳을 찾아서 인덱스 반환)
            var number = alphabet[String(Array(s)[i].uppercased())]! + n
            						 // z는 증가하면 a이기 때문에 26을 빼준다. 인덱스는 0부터 시작이기 때문
                                     if number > 25 {
                                     number = number - 26
                                              }
                                     // key들만 모아놓은 곳에서 인덱스로 알파벳을 찾는다
                                     let value = keys[number]						
                                     // 다시 알파벳딕셔너리에 value를 넣어줘서 해당 알파벳이 몇 번째인지 알아낸다 -> value1
                                     let value1 = alphabet.index(forKey: value)
       // 알파벳딕셔너리의 키 중 value의 순서가 있는 알파벳을 차례대로 대문자라면 그냥 더해주고 아니면 소문자로 변형해서 넣어준다.                             
       if Array(s)[i].isUppercase{
            answer += alphabet.keys[value1!]
        }else {
            answer += alphabet.keys[value1!].lowercased()
        }
    }
    return answer
}

회고

  • 내가 풀지 못했다
  • 배열과 딕셔너리 사용법을 좀 더 공부해야할 것 같다
profile
iOS Developer

0개의 댓글