본문 바로가기

[내일배움캠프]스파르타코딩클럽 AI 웹개발/Today I Learned

[내일배움캠프 08일차 TIL] ASCII(아스키코드) with python

 

Today's trigger

 

 


아스키코드는 무엇인가?

아스키(ASCII)는 미국 국립 표준 협회에서 표준화한 정보교환용 7비트 부호 체계이다

그래서 문자를 아스키를 통해 변환하면 숫자이 값으로 얻을 수 있는 것이다

 

파이썬에서는 ord()라는 내장 함수를 사용해서 문자를 ASCII로 바꿀 수 있었는데

print(ord('A'))

 

파이썬에서 위 코드를 출력해보면 65라는 값을 얻을 수 있다

아스키로 바꾼 값의 데이터타입은 int로 사칙연산이 가능하다!

 

그리고 아스키 값을 다시 문자로 바꾸는 코드는 chr()을 사용하면 된다

print(chr(65))

 

다시 위 코드를 실행하면 "A"라는 문자를 리턴해 출력해준다

 

이렇게 위의 두 가지를 이용해서 문제에 접근했다

주어진 문자를 아스키값으로 바꾸고 n만큼 더해준 후 다시 문자로 변환해주는 과정을 문자열에서 반복해주는 것이다

print(chr(ord('A')+1))

 

이렇게 코드를 실행하면 "B"를 얻을 수 있게 되는 것이다

 


 

코드카타 문제풀기

 

 

처음 제출 답안 코드는 정말 멍청함 그 잡채였다....

 

s = "zZ"
n = 1
 
answer = []
for i in s:
    if i == " ":
        answer.append(" ")
    elif (i == 'z') or (i == 'Z'):
        answer.append(chr(ord(i)-26+n))
    else:
        answer.append(chr(ord(i)+n))
 
print(''.join(answer))

 

정말 멍청하게도 테스트케이스의 z만 해결하면 되겠지라고 생각한 것...

그래서 테스트 케이스를 통과하고 

오늘 코드카타 5분컷 이러고 있었는데

그럴 리가 없지,,,

어김없이 실패,,, 그래서 무엇이 문제인가 생각해보았더니 n이 아닌 경우는 다른 문자들도 한 바퀴를 넘을 수 있다는 것!

 

 

 

그렇게 코드를 수정했다

def solution(s, n):
    answer = []
    for i in s:
        if i == " ":
            answer.append(" ")
        elif (ord(i)+n > ord('z')) or (ord(i)+n >= ord('Z')):
            answer.append(chr(ord(i)-26+n))
        else:
            answer.append(chr(ord(i)+n))
    return ''.join(answer)

 

이렇게 아스키 값이 z 나 Z의 값을 초과하게 되면 알파벳 개수를 빼주어 회전? 반복?이 되도록 코드를 짜 주었다.

그럼에도 에러가 발생했다...

파이썬의 A의 아스키코드는 65이고 Z는 96, a는 97 부터 시작하는데, 

위 코드에서는 소문자들을 n만큼 밀 때 ord('Z')보다 크기 때문에 무조건 26을 빼버린 것!

 

 

그래서 elif문에 ord(i) <= ord('Z') 부분을 추가해서 아래의 코드와 같이 만들었다

def solution(s, n):
    answer = []
    for i in s:
        if i == " ":
            answer.append(" ")
        elif (ord(i) <= ord('Z') and ord(i)+n > ord('Z')) or (ord(i)+n > ord('z')):
            answer.append(chr(ord(i)-26+n))
        else:
            answer.append(chr(ord(i)+n))
    return ''.join(answer)

 

이렇게 완성하고 제출해서 통과했다!

 


코드를 제출하고 통과하고나니 굳이 answer 부분을 리스트로 만들지 않고

빈 문자열에서 추가하는 방식이 더 나은 것 같아서 수정했다.

짧은 길이의 반복문이라 크게 의미는 없겠지만 조금이라도 효율적으로 짜고 싶은 나의 욕심이랄까...

 

 

매일 코드카타를 풀면서 자꾸 문제를 쉽게 보고 간과하는 점이 많은 것 같다

문제에서 요구하는 조건을 잘 살펴보고 효율적으로 코드를 짤 수 있도록 노력해야지!