코틀린(Kotlin)/프로그래머스

[프로그래머스/코틀린(Kotlin)] 시저 암호

초보왕보초 2023. 11. 21. 16:03
728x90

문자열 s에 있는 각 알파벳을 n만큼 밀어서 다른 알파벳으로 암호화하기

예시)

 

풀이

  • 카이사르 암호의 법칙.. (이라고 한다..)
  • 리스트화 후 다시 string 타입으로

 

제출 코드

(코드 해석해 보기)

이번 문제는 솔직히 리스트화(map)와 제한 조건 덕분에 when까지만 떠올릴 수 있었고,

대문자 알파벳과 소문자 알파벳을 일일이 다 적어놓고 인덱스를 뽑아서 쓰는 형식은 너무 얽히고 복잡해져서 포기했다

특히 5, 6번째 줄은 전혀 몰라서 검색을 통해 알게 되었다

알파벳 범위 사용하는 법도 알았었는데 까먹고 있었다..

 

5, 6) 카이사르 암호의 법칙을 이용하면 된다고 한다

fun Char.caesar(c: Int, n: Char, m: Char): Char =
    (n + (it - n + c) % (m - n + 1)).toChar()

 

n = 어떤 집단에서 처음이 되는 value (ex) 알파벳이면 'a')

it = 대상 value

c = 얼마큼 이동할 것인지

m = 어떤 집단의 마지막 value (ex) 알파벳이면 'z')

시작문자(n)를 빼고 얼마큼 밀지(c)를 구한 후 %를 이용해서 Z를 넘겼을 경우에 다시 a부터 출력하도록 나머지 계산한다

(만약 시작문자가 Z(마지막 알파벳)고 +2만큼 밀면 범위를 벗어나기 때문에, 문제에선 알파벳 전체범위(26)로 나머지 계산하면 28번째 알파벳을 출력하는 게 아니라 28%26 = 2 번째 알파벳을 출력할 수 있다)

 

프로그래머스 문제에서 s(it)가 "A"고 n이 2라고 가정하면 "C"가 나와야 한다

= 65 + (65 - 65+2))%((90 - 65+1))

= 65 + (2)%(34)

= 65 + 2

= 67

= C

(알파벳은 26개이기 때문에 %26으로 나머지 계산해도 되지만 Z(90)를 쓴 이유는,

범위를 특정하기 어려운 경우 마지막 value로 나머지 계산해야 하기 때문인 듯하다)

 

나 같은 초보자들은 왜 갑자기 65, 90 같은 숫자들이 나왔나 할 텐데, 대문자 A와 Z의 아스키코드이기 때문이다

컴퓨터는 문자를 문자로 기억하지 않는다

자연수 뒤집어 배열로 만들기 편에서 아스키코드에 그렇게 당하고도 또 당했다..

 

 

아스키코드표

 

7) else -> it으로 공백은 공백으로

9) .joinToString("")으로 구분자를 없애서 결괏값을 하나로 만든다

728x90