유형 : 구현

풀이 시간 : 약 30분?

def solution(s, n):
    tmp = list(ord(s[i]) for i in range(len(s)))
    for i in range(len(tmp)):
        if tmp[i] == 32:
            continue 
        else:
            if tmp[i] <= 90 and (tmp[i] + n) > 90:
                tmp[i] += n
                tmp[i] -= 26
            
            elif tmp[i] <= 122 and (tmp[i] + n) > 122:
                tmp[i] += n
                tmp[i] -= 26
            else: 
                tmp[i] += n
    answer = [chr(tmp[i])for i in range(len(tmp))]
    return ''.join(answer)

 

이렇게 오래 걸릴 문제가 아니었는데,, 쉽게 가려고 하지말고 그냥 처음 생각한 로직 그대로 밀고 나가자.

괜히 축약해서 코드를 썼다가 코너 케이스에서 다 걸렸다. 

 

ord() : 문자 -> 숫자

chr() : 숫자 -> 문자

 

def caesar(s, n):
    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)
    # 주어진 문장을 암호화하여 반환하세요.

 

1. 그냥 isupper이랑 islower 써서 대소문자 구분했으면 더 편했을 텐데..

그리고 숫자보다는 ord('a') 이렇게 쓰는 게 더 좋았을 것 같다. 

(ord(s[i])-ord('A')+ n)%26+ord('A') 이 식은.. 26으로 나눈 나머지를 반환해 초기값과 더함으로써 무조건 올바른 문자를 반환하도록 한다. 

 

새로 써보자. 

 

def solution(s, n):
    tmp = [ord(x) for x in s]
    A = ord('A')
    a = ord('a')
    space = ord(' ')
    for i in range(len(s)):
        if tmp[i] == space:
            continue
        elif s[i].isupper():
            tmp[i] = (tmp[i]-A+n) % 26 + A
        else:
            tmp[i] = (tmp[i]-a+n) % 26 + a
    answer = [chr(y) for y in tmp]
    return ''.join(answer)

 

훨씬 간단한 풀이가 되었다. 

더 간단한 풀이

def solution(s, n):
    tmp = [ord(x) for x in s]
    A, a, space = ord('A'), ord('a'), ord(' ')
    for i in range(len(s)):
        if tmp[i] == space:
            continue
        elif s[i].isupper():
            tmp[i] = (tmp[i]-A+n) % 26 + A
        else:
            tmp[i] = (tmp[i]-a+n) % 26 + a
    answer = [chr(y) for y in tmp]
    return ''.join(answer)
복사했습니다!