[프로그래머스](lv.1) 시저암호 (python)

0

코딩테스트

목록 보기
3/37
post-thumbnail

<문제>

<나의 풀이>

def solution(s, n):
    lower = 'abcdefghijklmnopqrstuvwxyz'*2
    upper = lower.upper()
    answer =''
    for ch in s :
        if ch.isupper() :
            index = upper.find(ch)
            answer += upper[index+n]
        elif ch.islower():
            index = lower.find(ch)
            answer+= lower[index+n]
        else :
            answer += ch
            
    return answer

<다른 풀이>

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)
    # 주어진 문장을 암호화하여 반환하세요.

# 실행을 위한 테스트코드입니다.
print('s는 "a B z", n은 4인 경우: ' + caesar("a B z", 4))

[출처] 프로그래머스 다른사람 코드

<보완점>

1) 문제 범위에서 n의 범위가 1~25까지였는데 z에서 a로 미룰 때의 인덱스 값을 어떻게 처리해야 할 지 몰라서 lower변수에 'abc...z'에 2를 곱했다. 만약 n의 조건이 없었다면 백퍼 틀릴 문제였다. 하하

나중에 생각해보니 26으로 나눈값의 인덱스를 찾으면 구할 수 있구나 꺠달았다!

2) 문자열에서 특정 문자가 있는 위치를 찾고 싶으면 문자열.find('특정문자')를 사용하면 된다!

<추가 공부>

다른 풀이를 보며 깨달은 것은 ord()와 chr()이었다. 아스키 코드를 이용하면 굳이 lower, upper 변수를 만들지 않아도 된다!

<잘한점>

그래도 시간제한 내에 문제를 풀자고 목표를 정했기 때문에 꼼수를 썻지만 제한 내에 풀어낸 나 자신 칭찬해.
(하지만 이후 더 좋은 코드를 위한 피드백은 시간을 들여 열심히 하자)

profile
두둥탁 뉴비등장

0개의 댓글