ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 27. 시저 암호
    코딩 테스트/Level 1 2019. 10. 25. 23:00
    반응형

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

     

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

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

    programmers.co.kr

     

    파이썬

    귀차니즘... 

    대-소문자를 구분해주는 함수도 문자의 아스키코드를 찾는 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;
        }
    }
    반응형
Designed by Tistory.