level1_시저암호

2024. 3. 5. 00:01파이썬_알고리즘(코딩테스트)/level1

이 문제를 보기전에 아스키코드를 먼저 알아야할것이다.

아스키코드란?

아스키는 미국 정보교환 표준 부호(American Standard Code for Information Interchange)이다.

줄여서는 ASCII 라고 표현한다. 말 그대로 정보를 교환하는 부호이다.

문자열이나 기호를 컴퓨터에 이용하기 위해서는 컴퓨터에 전달할 수 있도록 코드화, 부호화해야 하고 그런 과정을 문자 인코딩이라고 한다. 아스키코드는 기호와 영문알파벳에 적합한 문자 인코딩이다. 

 

 

 

 

내가 제출한 코드

def solution(s, n):
	# 대문자 65 - 90, 소문자 97 - 122
    # A = 65, Z = 90, z = 122, 공백 = 32
    s = list(s)
    
    for i in range(len(s)):
    	# 대문자일때
        if s[i].isupper():
        	s[i] = chr((ord(s[i]) - ord("A") + n) % 26 + ord("A"))
        # 소문자일때
        elif s[i].islower():
        	s[i] = chr((ord(s[i]) - ord("a") + n)% 26 + ord("a"))
    return "".join(s)

 

만약 대문자일 경우에는 

- ord(s[i]) - ord("A"): 현재 대문자 문자의 유니코드 코드 포인트에서 대문자 'A'의 유니코드 코드 포인트를 빼서 알파벳 상에서의 위치를 얻는다.

- (ord(s[i]) - ord("A") + n) % 26: 이동할 거리 n을 더하고 알파벳 길이(26)로 나눈 나머지를 계산하여 알파벳 상에서 이동한 위치를 구한다.

- chr(... + ord("A")): 다시 알파벳 상에서의 위치에 대응하는 대문자를 구한다.

 

소문자도 대문자랑 동일하다

- return "".join(s) : 리스트로 변환한 문자열을 다시 합쳐서 하나의 문자열로 반환한다.

 

다른 사람이 제출한 코드

def caesar(s, n):
	lower_list = "abcdefghijklmnopqrstuvwxyz"
    upper_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    
    result = []
    
    for i in s:
    	# 공백일경우
    	if i is " ":
        	result.append(" ")
        elif i.islower() is True:
        	new_ = lower_list.find(i) + n
            result.append(lower_list[new_ % 26])
        else:
        	new_ = upper_list.find(i) + n
            result.append(upper_list[new_ % 26])
    return "".join(result)

 

소문자, 대문자 알파벡을 담을 문자열을 정의한 다음에 공백일 경우에는 공백 그대로 결과 리스트에 추가되고,

그리고 elif i.islower() is True:는 elif i.islower():로 수정해서 작성해도 될 것 같다.

- lower_list.find(i) : 소문자 문자열에서 현재 문자의 인덱스를 찾는다. 

- 이후 이동할 거리 n을 더하고, 소문자 알파벳 길이 26으로 나눈 나머지를 구해서 결과 리스트에 추가한다. 

대문자도 동일하다.

 

 

코드를 보니깐 다른사람이 적어둔 코드가 더 간편한거 같기도 하다.