✏️ 2022-11-09 Today I Learn

@mitoconcrete · November 09, 2022 · 10 min read

[Python] 배열

  • 배열은 본래 메모리의 특정부분을 미리 할당받아 사용한다.
  • 하지만, 파이썬의 배열은 길이가 자유롭게 변화한다.
  • 이유는 파이썬는 내부적으로 동적배열을 사용하며, O(1)의 속도가 보장되도록 내부 로직이 구현되어 있기 떄문이다.

[Python] for...else

  • for...else 문의 else는 break, continue등을 거치지 않고, 완벽하게 반복문이 종료되었을 때의 처리를 위해 사용된다.
  • 다음은 input으로 입력된 배열에서 최댓값을 찾는 알고리즘이다.
  • def find_max_num(array):
      # 이 부분을 채워보세요!
      for num in nums:
          print('curr target num is : ', num)
          for compare_num in nums:
              print(f'num {num} compare with {compare_num}')
              if num < compare_num:
                  break
          else:
              return num
  • 처음에 봤을 땐 하나도 이해가 되지 않았지만, [3, 5, 6, 1, 2, 4]의 input을 주고, 로그를 찍으니 아래와 같이 표현되었다.
  • curr target num is :  3
    num 3 compare with 3
    num 3 compare with 5
    curr target num is :  5
    num 5 compare with 3
    num 5 compare with 5
    num 5 compare with 6
    curr target num is :  6
    num 6 compare with 3
    num 6 compare with 5
    num 6 compare with 6
    num 6 compare with 1
    num 6 compare with 2
    num 6 compare with 4
  • 즉, 6번의 모든 숫자를 순회해야, else로 넘어갈 수 있는 것이다. 반복문을 모두 순회하기 위해선, num < compare_num 이 조건을 피해야하는데, 그러기 위해선 num이 가장 큰 숫자여야 하는 것이다.
  • 잘 사용하진 않을 것 같지만,, 신기해서 기록한다.

[알고리즘] 소수정렬(아리스토테네스의 체)

def find_prime_list_under_number(number):
    prime_list = []
    for n in range(2, input):
        for i in prime_list:
            if n % i == 0 and i * i <= n:
                break
        else:
            prime_list.append(n)
    return prime_list

[알고리즘] 주어진 문자열을 모두 0 혹은 모두 1로 같게 만드는 최소 횟수를 반환하시오.

  1. 모든 숫자를 1로 변환하고자 할 때

    • 1 -> 0 으로 바뀌는 포인트를 카운팅한다
  2. 모든 숫자를 0으로 변환하고자 할 때

    • 0 -> 1 로 바뀌는 포인트를 카운팅한다.
  3. 풀이

    • 위의 1,2 에 해당되는 카운팅과 피벗체크포인트를 두고, 각 조건에 따라 변화를 주어 카운팅한다.
    • def find_count_to_turn_out_to_all_zero_or_all_one(string):
       zero_to_one_cnt, one_to_zero_cnt = 0, 0
       is_zero_to_one_convert_mode_active, is_one_to_zero_convert_mode_active = False, False
       for n in string:
           if n == "0":
               is_zero_to_one_convert_mode_active = False
           elif n == "1":
               is_one_to_zero_convert_mode_active = False
      
           if n == "0" and not is_one_to_zero_convert_mode_active:
               is_one_to_zero_convert_mode_active = True
               one_to_zero_cnt += 1
           elif n == "1" and not is_zero_to_one_convert_mode_active:
               is_zero_to_one_convert_mode_active = True
               zero_to_one_cnt += 1
      
       return min(zero_to_one_cnt, one_to_zero_cnt)

[알고리즘] 버블정렬

  • 앞에서 부터 두개씩 비교하여, 매 사이클마다 가장 큰 수가 맨 뒤로 가도록 만드는 정렬기법
  • 시간복잡도 : O(N2)O(N^2)
def bubble_sort(array):
  for i in range(len(array)):
      for j in range(len(array) - i - 1):
          if array[j] > array[j + 1]:
              array[j], array[j + 1] = array[j + 1], array[j]
  return array

[알고리즘] 선택정렬

  • 사이클에서 가장 작은수를 매 사이클마다 바뀌는 리스트의 가장 앞에 위치시키는 정렬 기법
  • 시간복잡도 : O(N2)O(N^2)
def selection_sort(array):
    for i in range(len(array)):
        min_val_idx = i
        for j in range(i, len(array)):
            # print(f'min val : {array[min_val_idx]}')
            # print(f'compare val : {array[j]}')
            if array[min_val_idx] > array[j]:
                min_val_idx = j
        if i != min_val_idx:
            array[i], array[min_val_idx] = array[min_val_idx], array[i]
    return

[알고리즘] 삽입정렬

  • 매 사이클의 마지막 인자를 매 사이클마다 바뀌는 리스트의 최적에 위치에 놓는 정렬기법
  • 시간복잡도 : O(N2)O(N^2)
  • 버블 정렬과 선택 정렬은 최선이든 최악이든 항~~상 O(N2)O(N^2) 만큼의 시간이 걸렸지만, 최선의 경우에는 Ω(N)Ω(N) 만큼의 시간 복잡도가 걸림
def insertion_sort(array):
    for i in range(0, len(input)):
        for j in range(i, 0, -1):
            if array[j] < array[j - 1]:
                array[j], array[j - 1] = array[j - 1], array[j]
            else:
                break

    return

공부해 볼 것

  • JIT 컴파일러 구조 및 동작원리
  • Python 컴파일러 별 속도

[회고] 221109

매번 느끼는 거지만, 알고리즘문제는 풀기전에는 그렇게 풀기싫은데 막상 문제에 접하게 되면 몰두하게 된다. 내배캠에 참여하게 되면서, 받은 책이 있다. 그 책에 한 글귀가 내가 왜 개발자라는 직군을 선택했는지, 명확하게 정리해주었다.

코딩이 즐거운 이유는 몰입을 유도해낼 조건을 모두 가지고 있기 때문이다. 몰입을 유도해내는 조건은 계속해서 도전과제가 주어지고, 그 도전과제를 해결하는 것을 통해 성장하는 것이다.

내가 개발자로서 처음 길을 택했던 계기는, 2017년 4월에 별찍기문제를 거의 한 1주일 동안 고민해서 해냈던 경험 이후 였다.
그 일주일 간 몰입했던 경험과 몰입을 통해 원하는 결과를 얻어냈던 순간이 정말 좋았던 기억이 있다.

개발자가 되기로 마음먹은날

하지만, 그 이후로 계속 왜인지 모르게 알고리즘은 자신도 없고, 뭔가 내 영역이 아니란 느낌을 받아서 의식적으로 밀어내었다.

개발자라는 직업은 계속 새로운 환경에 노출되어야 성장하는 것 같다. 나도 의도적으로 알고리즘문제를 접해도 '풀수 있다는 마인드'를 가지고 임해봐야겠다.

오늘은 강의 진도를 무진장 뺏는데, 다른팀원들을 보니 스케쥴대로 따라가는 것 같았다. 심지어 어떤 팀원 분은 아예 프로그래밍이 처음이라 강의를 따라가는 것이 버거워 책을 사서 개인공부를 하신다고 하신다. 내배캠이전 내가 다른부트캠프에서 공부를 하던 시절이 떠올랐다. 모든 게 다 중요한 것만 같아서, 매번 암기하고 정리하고 외우고 하느라 진도가 잘 빠지지 않았다. 그리고, 아티클 같은 것들을 막 첨부되어있는데, 불친절하게 '이거 읽어보면 좋다'라는 뉘앙스로 전달되었다. 너무 많은 정보가 쏟아지니 항상 머리가 터질 것만 같았다. 지금와서 생각해보면 그 때는 어떤게 중요하고 중요하지 않은 건지 필터링 할 수 있는 기준과 집중해야하는 범위가 명확하지 않아서 너무 힘들었다.

어려움을 겪으시는 팀원들의 모습을 보니, 예전에 힘들어했던 경험이 오버랩되었다. 또한, 뮨재해결에 조금이나마 익숙해진 내 모습을 보면서, 꽤나 내가 개발직군이 익숙해졌구나~ 싶어 감개무량했다. 지난주에도 그랬던 것 처럼, 어려움을 겪는 팀원들에게 올바른 방향을 잡아주고, 나 또한 적극적으로 도움을 받으며 공부기간을 보내보려고 한다.

또한, 지속적으로 내 자신감이 초기와 같지 않다는 것이 느껴지고 있는데, 의도적으로 자신감을 유지하려고 해야겠다. 자신감이 없어지면 의견을 내는것에 소극적이게 된다..!! 내 자신감을 저하시키는 요소들은 의도적으로 무시하려고 하자.

[다짐]

  • 의도적으로 자신감 다시 높이기
  • 새로운 문제에 노출 되는 것을 두려워하지 않기
  • 내 의견을 적극적으로 표출하기
  • 상대방의 말을 경청하기
  • 이해할 수 있는 단어를 선택하여 설명하기
@mitoconcrete
어제보다 조금 더 성장하기 위해 기록합니다.