ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬, 알고리즘... 뭔말이야..
    Python 2024. 7. 11. 02:55

    문제: 알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

     

    하.. 문제부터 이해를 안갔다.... 뭔말이야..ㅠㅠ

    겁이 났다. 아직 갈길이 먼데.. 

     

    일단 스스로 문제를 풀어보라는 강사님의 말씀에 한참을 바라보다가 지피티를 찾았다... 문제가 뭘 말하는지부터 좀 알려달라고...

     

    그제서야 문제가 뭘 말하는지 이해가 됐다.

    그치만.. 훈련이 안되어 있기 때문일까.. 처음이어서 일까... 또 한참을 생각만 했다.

     

     

    스스로는 풀지 못했고.. 이해만 했다...

    import string
    
    def get_idx(word):
        # point 1. ord
        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')

     

     

    일단, 아래 코드를 모두 주석처리 해주고 string.ascii_lowercase를 프린트해봤다.

     

     

    알파벳 a부터 z까지의 str값이 출력된다.

     

    이 문제에서 알파벳이 표기되는 디폴트값이 -1 이니까 일단 [-1]이라는 리스트를 만들어주는데 알파벳 개수만큼 만들어줘야하니까 알파벳 개수를 곱해주면 되는거다. 

    그래서 [-1]*len(string.ascii_lowercase) 이걸 출력해보면 

    [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]

     

    이렇게 나온다.

     

    이제 주어진 단어를 표기해야하니까 임의의 단어 word 를 for문으로 돌려서 스펠링 하나하나를 확인한다.

    여기서 ord 는 문자를 숫자로 만들어주는 함수다. 앞으로 기본적인 아스키 (ASCII) 코드는 외워두는게 좋을 것 같다. 

     

    26개의 알바벳을 인덱스 값으로 표기해주면 된다. 

    [-1 (a = 0), -1 (b = 1), -1 (c = 2) .....] 이렇게 되도록 하기 위해   

        for i in range(len(word)):
            idx = ord(word[i]) - ord('a') # 주어진 단어의 인덱스 값

     

    a 맨 첫 알파벳이니까 ord('a')를 뺴주면 a부터 z까지 0, 1, 2, 3 .. 순서로 각 알파벳의 인덱스 값을 만들어 줄 수 있다.

     

    그리고 문제에서 각각의 알파벳에 대해 단어에 포함되어 있는 경우, 처음 등장하는 위치를 표기하라고 했으므로 

    알파벳이 중복되는 경우 위치가 덮어씌워지지 않도록 (해당 알파벳의 첫 등장 위치를 반환) 이렇게 코드를 짠다.

            if result[idx] == -1: # 해당 알파벳이 아직 기록되지 않은 경우에만
                result[idx] = i # 해당 알파벳의 첫 등장 위치를 반환

     

     

    출력은 리스트로 해도 되지만 보기 좋게 인덱스값만 보여지도록, 요소들을 문자열로 바꾸고 공백으로 구분해준다.

    [0, -1, -1, ...]

    0 -1 -1 ...

        print(' '.join([str(num) for num in result]))

     

    map 함수를 써도 된다. 

        print(' '.join(map(str, result)))

     

     

    전체 코드

     

    만약 단어를 atom이라고 한다면

    import string
    
    def get_idx(word):
        result = [-1]*len(string.ascii_lowercase)
    
        for i in range(len(word)):
            idx = ord(word[i]) - ord('a') # 주어진 단어의 인덱스 값
            if result[idx] == -1: # 해당 알파벳이 아직 기록되지 않은 경우에만
                result[idx] = i # 해당 알파벳의 첫 등장 위치를 반환
    
        print(' '.join([str(num) for num in result]))
        print(' '.join(map(str, result)))
    
    get_idx('atom')

     

    이렇게 처리된다. 

    0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 -1 2 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1
    0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 -1 2 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1

     

     

Designed by Tistory.