[python_파이썬_pass]프로그래머스_LV1_시저 암호_풀이

2024. 5. 9. 12:30코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/kdCOczz1e9c?feature=shared

쉽게 봤다가 애를 좀 먹었다.

 

문제를 크게 보고 정확히 이해하자.!

 

<첫번째 시도 : 실패>

처음 실패 이후 왜 실패인지도 정확히 알아차리지 못했음, 공백 조건이 있어 2개 이상 공백이 나와도 1개로 처리해야하나? 이런생각만 함.

def solution1(s, n):
    answer = ''
    for i in s:
        if i.isalpha():
            if i == 'z' or i == 'Z':
                answer += chr(ord(i) + n - 26)
            else:
                answer += chr(ord(i) + n)
        else:
            answer += i
    return answer

 

<두번째 시도 : 실패>

당연히 첫번째 실패 이후 문제점을 잘못찾았으니 실패....

def solution2(s, n):
    answer = ''
    for i in s:
        if i == 'z' or i == 'Z':
            answer = s.replace(i, chr(ord(i) + n - 26))
        else:
            answer = s.replace(i, chr(ord(i) + n))
    return answer

 

<세번째 시도 : 실패>

계속 공백 조건이 잘못된 부분인줄 알고 그부분만 공략함 : 당연히 실패

def solution3(s, n):
    answer = ''
    for index, i in enumerate(s):
        if i.isalpha():
            if i == 'z' or i == 'Z':
                answer += chr(ord(i) + n - 26)
            else:
                answer += chr(ord(i) + n)
        else:
            if s[index] == ' ' and s[index - 1] == ' ':
                continue
            else:
                answer += i
    return answer

 

<네번째 시도 : 성공>

공백은 상관 없었고, 문제를 너무 단순하게 봤음.

알파벳 + n이 z를 벗어나는 조건을 찾아냈음.

def solution(s, n):
    answer = ''
    for i in s:
        if i.isupper():
            if (ord(i) + n) > ord('Z'):
                answer += chr(ord(i) + n - 26)
            else:
                answer += chr(ord(i) + n)
        elif i.islower():
            if (ord(i) + n) > ord('z'):
                answer += chr(ord(i) + n - 26)
            else:
                answer += chr(ord(i) + n)
        else:
            answer += i
    return answer

 

 

<다른사람풀이 참고>

나머지를 활용했네?  아직까지 나머지를 활용한 수학적 문제접근이 부족한 것 같다.

즉, s = "AB", n = 1이면

A는 아스키 코드로 65니까 (65-65 + 1) % 26을 해서 1이 나오게 한다음 65를 더해서 66이 나오게끔하는 접근

C가 온다면 67-65+1 = 3 % 26 = 3 + 65는 68이라서 D가 나오게 하는 접근

def solution(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)
728x90
반응형