Today's trigger
오늘자 알고리즘 코드카타 문제는 시저암호로
https://school.programmers.co.kr/learn/courses/30/lessons/12926
이 문제를 푸는 것이었다
문제를 보자마자 든 생각이 아스키코드를 이용해야겠다는 생각이 들었다
아스키코드는 무엇인가?
아스키(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 부분을 리스트로 만들지 않고
빈 문자열에서 추가하는 방식이 더 나은 것 같아서 수정했다.
짧은 길이의 반복문이라 크게 의미는 없겠지만 조금이라도 효율적으로 짜고 싶은 나의 욕심이랄까...
매일 코드카타를 풀면서 자꾸 문제를 쉽게 보고 간과하는 점이 많은 것 같다
문제에서 요구하는 조건을 잘 살펴보고 효율적으로 코드를 짤 수 있도록 노력해야지!
'[내일배움캠프]스파르타코딩클럽 AI 웹개발 > Today I Learned' 카테고리의 다른 글
[내일배움캠프 10일차 TIL] 이중리스트 풀기 with python (0) | 2024.07.05 |
---|---|
[내일배움캠프 09일차 TIL] 파이썬에서 클래스 이해하기 (0) | 2024.07.04 |
[내일배움캠프 07일차 TIL]무한루프 반복문 (1) | 2024.07.02 |
[내일배움캠프 06일차 TIL] 비밀번호 해싱 with hashlib in python (0) | 2024.07.01 |
[내일배움캠프 05일차] 패킹과 언패킹 (0) | 2024.06.28 |