[Level 1] 프로그래머스 시저 암호 코틀린 풀이

[Level 1] 프로그래머스 시저 암호 코틀린 풀이

프로그래머스 시저 암호 코틀린 풀이


문제 소개

이번에 풀어볼 문제는 카이사르 암호, 시저 암호로 불리는 암호에 관련된 문제이다.

problem


문제풀이

문자열 분기치기

우선 이번에는 문자단위로 컨트롤해야하니 3가지의 경우로 각각 나누어서 when을 사용했습니다.

1
2
3
4
5
6
7
s.map {
when (it) {
in 'A'..'Z' -> it.caesar(n, 'A', 'Z')
in 'a'..'z' -> it.caesar(n, 'a', 'z')
else -> it
}
}.joinToString("")

이렇게 짜면 문자열이 대문자인지, 소문자인지, 그 외인지를 판단해서 확장함수를 사용해서 넘겨서 시프트 처리를 하도록 했습니다.

확장함수의 구현

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

구현은 카이사르 암호의 법칙만 알고있다면 구현은 간단합니다.

C라면 A로 부터 2를 더하면 되는것을 이용해서

입력받은 Char애서 시작문자(n)를 빼고 얼만큼 밀지 구해두고 % 를 이용해서 Z 에서 4칸을 밀면 D로 넘어가도록 나머지 연산을 이용합니다!

두개를 합치면 끝이에요!!


정답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
fun solution(s: String, n: Int): String =
s.map {
when (it) {
in 'A'..'Z' -> it.caesar(n, 'A', 'Z')
in 'a'..'z' -> it.caesar(n, 'a', 'z')
else -> it
}
}.joinToString("")

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

시저암호! 흥미로운 문제였습니다!

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

댓글