[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 -> 0 으로 바뀌는 포인트를 카운팅한다
-
모든 숫자를 0으로 변환하고자 할 때
- 0 -> 1 로 바뀌는 포인트를 카운팅한다.
-
풀이
- 위의 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)
[알고리즘] 버블정렬
- 앞에서 부터 두개씩 비교하여, 매 사이클마다 가장 큰 수가 맨 뒤로 가도록 만드는 정렬기법
- 시간복잡도 :
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[알고리즘] 선택정렬
- 사이클에서 가장 작은수를 매 사이클마다 바뀌는 리스트의 가장 앞에 위치시키는 정렬 기법
- 시간복잡도 :
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[알고리즘] 삽입정렬
- 매 사이클의 마지막 인자를 매 사이클마다 바뀌는 리스트의 최적에 위치에 놓는 정렬기법
- 시간복잡도 :
- 버블 정렬과 선택 정렬은 최선이든 최악이든 항~~상 만큼의 시간이 걸렸지만, 최선의 경우에는 만큼의 시간 복잡도가 걸림
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주일 동안 고민해서 해냈던 경험 이후 였다.
그 일주일 간 몰입했던 경험과 몰입을 통해 원하는 결과를 얻어냈던 순간이 정말 좋았던 기억이 있다.

하지만, 그 이후로 계속 왜인지 모르게 알고리즘은 자신도 없고, 뭔가 내 영역이 아니란 느낌을 받아서 의식적으로 밀어내었다.
개발자라는 직업은 계속 새로운 환경에 노출되어야 성장하는 것 같다. 나도 의도적으로 알고리즘문제를 접해도 '풀수 있다는 마인드'를 가지고 임해봐야겠다.
오늘은 강의 진도를 무진장 뺏는데, 다른팀원들을 보니 스케쥴대로 따라가는 것 같았다. 심지어 어떤 팀원 분은 아예 프로그래밍이 처음이라 강의를 따라가는 것이 버거워 책을 사서 개인공부를 하신다고 하신다. 내배캠이전 내가 다른부트캠프에서 공부를 하던 시절이 떠올랐다. 모든 게 다 중요한 것만 같아서, 매번 암기하고 정리하고 외우고 하느라 진도가 잘 빠지지 않았다. 그리고, 아티클 같은 것들을 막 첨부되어있는데, 불친절하게 '이거 읽어보면 좋다'라는 뉘앙스로 전달되었다. 너무 많은 정보가 쏟아지니 항상 머리가 터질 것만 같았다. 지금와서 생각해보면 그 때는 어떤게 중요하고 중요하지 않은 건지 필터링 할 수 있는 기준과 집중해야하는 범위가 명확하지 않아서 너무 힘들었다.
어려움을 겪으시는 팀원들의 모습을 보니, 예전에 힘들어했던 경험이 오버랩되었다. 또한, 뮨재해결에 조금이나마 익숙해진 내 모습을 보면서, 꽤나 내가 개발직군이 익숙해졌구나~ 싶어 감개무량했다. 지난주에도 그랬던 것 처럼, 어려움을 겪는 팀원들에게 올바른 방향을 잡아주고, 나 또한 적극적으로 도움을 받으며 공부기간을 보내보려고 한다.
또한, 지속적으로 내 자신감이 초기와 같지 않다는 것이 느껴지고 있는데, 의도적으로 자신감을 유지하려고 해야겠다. 자신감이 없어지면 의견을 내는것에 소극적이게 된다..!! 내 자신감을 저하시키는 요소들은 의도적으로 무시하려고 하자.
[다짐]
- 의도적으로 자신감 다시 높이기
- 새로운 문제에 노출 되는 것을 두려워하지 않기
- 내 의견을 적극적으로 표출하기
- 상대방의 말을 경청하기
- 이해할 수 있는 단어를 선택하여 설명하기