-
27. 시저 암호코딩 테스트/Level 1 2019. 10. 25. 23:00반응형
https://programmers.co.kr/learn/courses/30/lessons/12926
파이썬
귀차니즘...
대-소문자를 구분해주는 함수도 문자의 아스키코드를 찾는 ord 함수도 사용하지 않았습니다.
인덱스를 %로 정리해주지도 않았습니다. 인덱스 함수만 썼습니다.
def solution(s, n): answer = "" ABC = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ" abc = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" for i in s: if i in ABC: answer += ABC[ABC.index(i) + n] elif i in abc: answer += abc[abc.index(i) + n] else: answer += ' ' return answer
자바스크립트
컨셉이 맘에 들어 계속 밀어봅니다.
function solution(s, n) { const abc = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz' const ABC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ' return s.split('').map(letter => { if (letter == ' ') { return ' ' } else if (abc.indexOf(letter) > -1) { return abc[abc.indexOf(letter) + n] } else { return ABC[ABC.indexOf(letter) + n] } }).join('') }
abc.indexOf(letter)를 2번 쓴 게 불편해서 고쳐보았습니다.
그런데 가독성이 확 떨어지는 느낌입니다.
function solution(s, n) { const abc = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz' const ABC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ' return s.split('').map(letter => { let idx = abc.indexOf(letter) if (letter == ' ') { return ' ' } else if (idx > -1) { return abc[idx + n] } else { return ABC[ABC.indexOf(letter) + n] } }).join('') }
자바
char array를 쓰니 깔끔합니다.
class Solution { public String solution(String s, int n) { char[] letters = s.toCharArray(); for (int i = 0; i < s.length(); i++) { if ('A' <= letters[i] && letters[i] <= 'Z') { letters[i] = (char) ((letters[i] - 'A' + n) % 26 + 'A'); } else if ('a' <= letters[i] && letters[i] <= 'z') { letters[i] = (char) ((letters[i] - 'a' + n) % 26 + 'a'); } } return String.valueOf(letters); } }
고
자바와 비슷한 컨셉입니다.
고에서는 rune()형을 명시적으로 써줘야 rune 연산에 낄 수가 있더군요.
생각해 보면 맞는데, 생각하고 살기가 쉽지 않습니다.func solution(s string, n int) string { result := make([]rune, len(s)) offset := rune(n) for i, v := range s { if 'A' <= v && v <= 'Z' { result[i] = ((v + offset - 'A') % 26) + 'A' } else if 'a' <= v && v <= 'z' { result[i] = ((v + offset - 'a') % 26) + 'a' } else { result[i] = v } } return string(result) }
코틀린
코드가 파이썬을 많이 닮았습니다.
파이썬의 enumerate가 withIndex...if in도 거의 비슷합니다.
class Solution { fun solution(s: String, n: Int): String { val letters = s.toCharArray() for ((i, letter) in letters.withIndex()) { if (letter in 'A'..'Z') { letters[i] = ((letter - 'A' + n) % 26 + 'A'.toInt()).toChar() } else if (letter in 'a'..'z') { letters[i] = ((letter - 'a' + n) % 26 + 'a'.toInt()).toChar() } } return String(letters) } }
코틀린의 'A'..'Z' 재미있습니다. 코틀린 시작한지 얼마 안되서 ㅎㅎ 아주 신선한 느낌입니다.
C#
public class Solution { public string solution(string s, int n) { string answer = ""; foreach (char c in s) { if (c >= 'a' && c <= 'z') answer += (char)((c - 'a' + n) % 26 + 'a'); else if (c >= 'A' && c <= 'Z') answer += (char)((c - 'A' + n) % 26 + 'A'); else answer += ' '; } return answer; } }
반응형