[TIL] 나만의 알고리즘 공부방법을 구축했다.

조성현·2022년 11월 10일
1

어제는 발, 오늘은 무릎까지 '알고리즘 탕'에 들어갔다.

소소하게 깨달은 점:
역시 사람은 잠을 자야 뇌가 돈다


입수과정 (알고리즘 풀이&공부 과정)


1. 문자열 요약해보기 문제

  • 먼저 어떻게 문제를 풀어야 할지 구상하고 그림을 그렸다.(기획과정)

  • 나만의 코드로 알고리즘을 완성했다.

  • 이후 답안을 보고, 나의 코드와 비교하며 어떤 점이 다른지, 어떻게 개선할 수 있는지 분석한다.

  • 분석을 토대로 나의 코드를 개선한다.

 def alphabet_counter(string):
    alphabet_count_array = [0]*26
    for alphabet in string:
        if not alphabet.isalpha():
            continue
        alphabet_count_array[ord(alphabet)-ord('a')] += 1

    exist_alphabet_list = []
    for i in range(len(alphabet_count_array)):
        if alphabet_count_array[i] == 0:
            continue
        exist_alphabet_list.append(chr(i+ord('a')) + str(alphabet_count_array[i]))

    alphabet_count_load = ""
    for exist_alphabet in exist_alphabet_list:
        if exist_alphabet == exist_alphabet_list[-1]:
            alphabet_count_load += exist_alphabet
            continue
        alphabet_count_load += exist_alphabet + "/"
    print(alphabet_count_load)


alphabet_counter("aas ddfffmmm ii")
alphabet_counter("aadd jj iiiii")

풀이과정 1~2:
문제를 본 뒤, 아이디어를 정리하고 나만의 코드로 알고리즘을 구현했다.

def summarize_string(target_string):
    n = len(target_string)
    count = 0
    result_str = ''

    for i in range(n - 1):
        if target_string[i] == target_string[i + 1]:
            count += 1
        else:
            result_str += target_string[i] + str(count + 1) + '/'
            count = 0

    result_str += target_string[n - 1] + str(count + 1)

    return result_str

풀이과정 3:
답안을 보며 나의 코드와 비교하며 어떤 점이 다른지, 어떻게 개선할 수 있는지 분석했다.

나의 코드 개선점 분석

  1. 이 문제에서는 굳이 필요 없는 띄어쓰기 검증과정이 들어가 있다.
  • 에러방지의 목적도 있어 뺄 수는 없다..
  1. 배열을 생성하는 방식으로 구성했다.
  • 이로인해 넣고, 꺼내고, 정제하는 과정이 여러번 생겼다.
  • 알고리즘에서야 사소할 수 있지만, 실무에서는 (데이터 이동 == 비용)이므로 좋은 코드라 볼 수 없다.
  1. 불필요한 과정이 하나 추가되어 있다.
  • 'exist_alphabet_list'를 굳이 만들 필요가 없이, 바로 'alphabet_count_load'에 값을 넣는다면 2번째 for문과 3번째 for문을 합칠 수 있다.

풀이과정 4:
개선점 분석을 토대로 나의 코드를 수정했다.

def alphabet_counter(string):
    alphabet_count_array = [0]*26
    for alphabet in string:
        if not alphabet.isalpha():
            continue
        alphabet_count_array[ord(alphabet)-ord('a')] += 1

    alphabet_count_load = ""
    for i in range(len(alphabet_count_array)):
        if alphabet_count_array[i] == 0:
            continue
        alphabet_count_load += (chr(i + ord('a')) + str(alphabet_count_array[i]) + '/')

    return alphabet_count_load[:-1].rstrip()

Today I Learned

1. Array와 Linked_list에 대해 배웠다.

  • 사진출처(스파르타코딩클럽-박현준 튜터-알고리즘 강의자료)
  • 파이썬의 배열은 링크드 리스트로 쓸 수도 있고, 배열로도 쓸 수 있게 만든 효율적인 자료구조다! (내부적으로 동적배열을 사용함)
  • (동적배열이란) https://en.wikipedia.org/wiki/Dynamic_array

2. 단순히 문제만 푼 것이 아니라, 나의 코드와 답안을 비교하며 개선점을 찾고 내 코드를 발전시키는 경험을 했다.

profile
맛있는 음식과 여행을 좋아하는 당당한 뚱땡이

2개의 댓글

comment-user-thumbnail
2022년 11월 10일

아주 훌륭합니다

1개의 답글