Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL][240715] ASCII(아스키코드), string 모듈 본문

WHAT I LEARN/TIL

[TIL][240715] ASCII(아스키코드), string 모듈

노네임드개발자 2024. 7. 15. 23:03
어떤 문제가 있었나?

알고리즘 문제를 풀다 보면 딜레마가 생긴다. 너무 어려운 문제는 정답코드를 확인하곤 하는데, 강의에서 언급이 없거나 가볍게 넘어간 문법을 사용한 풀이라 코드를 읽는데 어려움이 있었다. 또는 이미 존재하는 라이브러리를 사용하여 쉽게 해결하는 코드도 있었다.

정답을 맞추는 것도 중요하지만 풀이하는 과정이 중요하다고 생각하기에 최대한 배운 것을 위주로 문제 풀이를 했지만, 많은 사람들이 강의에서 언급하지 않거나 가볍게 언급한 문법을 사용한 풀이를 보면 내 풀이를 시간 복잡도를 고려하지 않은 풀이가 되었다. 

그렇다면 새로운 라이브러리, 문법을 공부하여 적극 사용한다면 공부가 될까? 아직 답을 내리진 못했었다. 


무엇을 시도했나?

오늘 알고리즘 특강, 강의 그리고 스쿼드 모두 시공간 복잡도에 대해 강조했다. 덕분에 그동안 알고리즘을 풀면서 생겼던 고민이 조금은 해결이 된 듯하다. 시간 복잡도에 대한 개념이 부족하여 고집을 부렸는데 "어느 것이 더 나은 코드인가"를 구별할 수 있다면 새로운 문법, 내용을 적극적으로 공부하고 구현하는 것이 코드와 나 자신 모두에게 효율적이 될 것이다. 또한 문법을 많이 안다면 문제에 대한 접근 방식 또한 다양해질 것이다. 따라서 애매하게 알거나 모르는 문법을 사용한 코드를 읽고 내가 다시 한번 구현하면서 익숙해지는 연습을 했다.


어떻게 해결됐는가?

알고리즘 강의에서 백준(10809) 문제를 다뤘다. 문제를 먼저 푼 후 강의 풀이 내용이 매우 달라서 혼란스러웠지만 코드를 천천히 읽어봤다. 아래는 내가 작성한 코드와 강의에서 나온 코드이다.

# 내 풀이
def change_index(word):
    answer = []
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    for i in alphabet:
        if i in word:
            answer.append(word.index(i))
        else:
            answer.append(-1)
    print(str(answer)[1:-1])  # 슬라이스는 문자열에서만 가능   


change_index('baekjoon')

# 강의 풀이
import string

def get_idx(word):
    result = [-1]*len(string.ascii_lowercase)
    for i in range(len(word)):
        idx = ord(word[i]) - 97
        if result[idx] == -1:
            result[idx] = i
    print(' '.join([str(num) for num in result]))
    

get_idx('baekjoon')

# 1, 0, -1, -1, 2, -1, -1, -1, -1, 4, 3, -1, -1, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
# 1, 0, -1, -1, 2, -1, -1, -1, -1, 4, 3, -1, -1, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1

같은 출력을 내고, 시간 복잡도를 고려한다면 둘다 O(n)이라서 어느 것이 더 나은 코드라 말할 수는 없었다. 하지만 강의에서 나온 아스키코드와 string 라이브러리는 이전 코드카타 시저 암호 문제에서 봤던 내용이었다. 다른 문제지만 풀이가 비슷하여 아스키코드와 string 라이브버리는 공부하는 것이 좋다고 판단되어, 강의 코드 처럼 다시 구현을 해봤다.


새로 알게 된 점은 무엇인가?

아스키코드

미국 정보교환표준부호(American Standard Code for Information Interchange)를 줄여서 ASCII라 한다. 컴퓨터가 영어 문자를 인식할 수 있게 이진법 수에 문자를 매핑한 것이다. 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수문자, 그리고 하나의 공백 문자를 표현할 수 있다.  ASCII Table을 통해 ASCII를 확인할 수 있다.

감사하게도 파이썬에는 ASCII를 지원하는 내장함수가 존재한다. 바로 ord()와 chr()인데 내용은 아래와 같다.

  • ord(): 문자를 숫자로 출력
  • chr(): 숫자를 문자로 출력
idx = ord(word[i]) - 97

백준(10809) 문제 강의 풀이에서 위 코드가 나왔는데 ASCII Table을 참고하면 97은 a를 의미한다. 따라서 위의 코드는 word[i](알파벳)을 숫자로 출력하여 97을 뺀다면 a~z의 인덱스를 알아낼 수 있다.

 

string 모듈

파이썬 공식 문서에 따르면 string 모듈을 통해서 9가지 상수가 존재한다. 그 중 몇개만 뽑아서 정리해보자.

  • string.ascii_letters: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
  • string.ascii_lowercase: abcdefghijklmnopqrstuvwxyz
  • string.ascii_uppercase: ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • string.digits: 0123456789(문자열)

무엇을 느꼈고 내일은 무엇을 할까?

앞으로 알고리즘을 풀면서 내가 배우지 않거나 애매하게 알고 있는 문법은 애써 외면했는데, 오늘부터 TIL에 차분히 정리해야겠다.