1주차를 마무리 짓고 2주차를 듣기 시작했다....
이건 뭐지...
ㅜㅠ
1주차
alphabet_array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "x", "y", "z"]
# -> 26 개의 공간을 사용합니다
max_occurrence = 0 # 1개의 공간을 사용합니다
max_alphabet = alphabet_array[0] # 1개의 공간을 사용합니다.
for alphabet in alphabet_array:
occurrence = 0 # 1개의 공간을 사용합니다
alphabet_array의 길이 = 26
max_occurrence, max_alphabet, occurrence의 변수 = 3
== 29만큼의 공간이 사용됨.
alphabet_occurrence_list = [0] * 26 # -> 26 개의 공간을 사용합니다
for char in string:
if not char.isalpha():
continue
arr_index = ord(char) - ord('a') # 1개의 공간을 사용합니다
alphabet_occurrence_list[arr_index] += 1
max_occurrence = 0 # 1개의 공간을 사용합니다
max_alphabet_index = 0 # 1개의 공간을 사용합니다
for index in range(26):
alphabet_occurrence = alphabet_occurrence_list[index] # 1개의 공간을 사용합니다
if alphabet_occurrence > max_occurrence:
max_occurrence = alphabet_occurrence
max_alphabet_index = index
alphabet_array의 길이 = 26
max_occurrence, max_alphabet, occurrence의 변수 = 4
== 30만큼의 공간이 사용됨.
for alphabet in alphabet_array: # alphabet_array 의 길이(26)만큼 아래 연산이 실행
occurrence = 0 # 대입 연산 1번 실행
for char in string: # string 의 길이만큼 아래 연산이 실행
if char == alphabet: # 비교 연산 1번 실행
occurrence += 1 # 대입 연산 1번 실행
if occurrence > max_occurrence: # 비교 연산 1번 실행
max_alphabet = alphabet # 대입 연산 1번 실행
max_occurrence = number # 대입 연산 1번 실행
alphabet_array 의 길이 X 대입 연산 1번
alphabet_array 의 길이 X, string의 길이 X (비교 연산 1번 + 대입 연산 1번)
alphabet_array 의 길이 X (비교 연산 1번 + 대입 연산 2번)
== 26(1 + 2N + 3) = 52N + 104
for char in string: # string 의 길이만큼 아래 연산이 실행
if not char.isalpha(): # 비교 연산 1번 실행
continue
arr_index = ord(char) - ord('a') # 대입 연산 1번 실행
alphabet_occurrence_list[arr_index] += 1 # 대입 연산 1번 실행
max_occurrence = 0 # 대입 연산 1번 실행
max_alphabet_index = 0 # 대입 연산 1번 실행
for index in range(len(alphabet_occurrence_list)): # alphabet_array 의 길이(26)만큼 아래 연산이 실행
alphabet_occurrence = alphabet_occurrence_list[index] # 대입 연산 1번 실행
if alphabet_occurrence > max_occurrence: # 비교 연산 1번 실행
max_occurrence = alphabet_occurrence # 대입 연산 1번 실행
max_alphabet_index = index # 대입 연산 1번 실행
string의 길이 X (비교 연산 1번 + 대입 연산 2번)
대입 연산 2번
alphabet_array 의 길이 X (비교 연산 1번 + 대입 연산 3번)
== N (1 + 2) + 2 + 26 (1 + 3) = 3N + 106
input = [3, 5, 6, 1, 2, 4] # 배열 내 특정 숫자가 존재하면 True, 아니면 False
def is_number_exist(number, array):
for element in array:
if number == element:
return True
return False
result = is_number_exist(3, input)
print(result)
이 함수의 시간 복잡도는?
input = [3, 5, 6, 1, 2, 4]
def is_number_exist(number, array):
for element in array: # array 의 길이만큼 아래 연산이 실행
if number == element: # 비교 연산 1번 실행
return True # N * 1 = N 만큼
return False
result = is_number_exist(3, input)
print(result)
input = [4, 5, 6, 1, 2, 3] # 운이 안 좋으면 input의 길이인 N만큼의 연산을 다 해야됨
def is_number_exist(number, array):
for element in array: # array 의 길이만큼 아래 연산이 실행
if number == element: # 비교 연산 1번 실행
return True # N * 1 = N 만큼
return False
result = is_number_exist(3, input)
print(result)
알고리즘은 성능이 항상 동일한 것이 아니라 입력 값과 입력값의 분포에 따라 성능이 변화할 수 있음
표기법
input = [0, 3, 5, 6, 1, 2, 4]
def find_max_plus_or_multiply(array):
multiply_sum = 0 # 현재 계산하고 있는 합계
for number in array:
if number <= 1 or multiply_sum <= 1:
multiply_sum += number
else:
multiply_sum *= number
return multiply_sum
result = find_max_plus_or_multiply(input)
print(result)
input = "abadabac"
def find_not_repeating_first_character(string):
alphabet_occurrence_array = [0] * 26
for char in string:
if not char.isalpha():
continue
arr_index = ord(char) - ord("a")
alphabet_occurrence_array[arr_index] += 1
not_repeating_character_array = [] # 하나만 나오는 캐릭터들
for index in range(len(alphabet_occurrence_array)):
alphabet_occurrence = alphabet_occurrence_array[index]
if alphabet_occurrence == 1:
not_repeating_character_array.append(chr(index + ord("a"))) # index를 다시 한번 알파벳으로 전환시켜줘야함
print(not_repeating_character_array)
for char in string:
if char in not_repeating_character_array:
return char
return "_"
result = find_not_repeating_first_character(input)
print(result)
2주차
class Person:
def __init__(self, param_name): # self는 항상 존재해야 함
print("i am created!", self)
self.name = param_name
def talk(self):
print("안녕하세요, 제 이름은", self.name, "입니다.")
person_1 = Person("유재석") # () : 생성자(객체를 생성할 때 쓰는 함수)
print(person_1.name)
print(person_1)
person_1.talk()
person_2 = Person("박명수")
print(person_2.name)
print(person_2)
person_2.talk()
링크드 리스트 구현
노드에게 필요한 것
코드
# [3] -> [4] // 노드 안에 들어가야 할 것 : 각 노드가 데이터랑 다음 칸에 있는 포인터가 있어야 함
# data, next // 다음 칸을 나타내는 것들
class Node: # 데이터와 넥스트를 주입 받아야 함
def __init__(self, data): # data를 입력받아서 self.data에 저장을 할 것임
self.data = data # self.data에 data를 주입함
self.next = None # self.next에는 None을 넣어줌 < 처음 생성할 때에는 아무것도 다음을 가리키지 않기 때문
node = Node(3) # 테스트
print(node) # 실행값 = <__main__.Node object at 0x00000269950E5BE0>
----------
print(node.data) # 실행값 = 3
----------
node = Node(3) # 테스트
first_node = Node(4)
node.next = first_node
print(node.next.data) # 실행값 = 4
print(node.data) # 실행값 = 3
링크드리스트 구현
class LinkedList: # LinkedList는 head node만 가지고 있으면 됨
def __init__(self, data): # self, data를 받고
self.head = Node(data) # self.head에 해당 data를 들고 있는 노드를 생성해서 넣어주면 됨
# 방금 생성한 이 노드가 head 노드로 저장이 됨 >> LinkedList 생성 끝!!
linked_list = LinkedList(3) # linked_list 정의해보자
print(linked_list) # 실행값 = <__main__.LinkedList object at 0x000002002D3FE970>
----------
print(linked_list.head) # 실행값 = <__main__.Node object at 0x00000201C321ED00>
----------
print(linked_list.head.data) # 실행값 = 3
----------
print(linked_list.head.next) # 실행값 = None
append라는 함수 구현
class Node:
def __init__(self, data):
self.data = data
self.next = None
node = Node(3)
first_node = Node(4)
node.next = first_node
class LinkedList:
def __init__(self, data):
self.head = Node(data)
def append(self, data):
if self.head is None:
self.head = Node(data)
return
cur = self.head
while cur.next is not None:
cur = cur.next
print("cur is", cur.data)
cur.next = Node(data)
# 노드들의 값들을 전부 다 출력해보자
def print_all(self):
print("hihihi")
cur = self.head
while cur is not None:
print(cur.data) # cur을 계속 옮기면서 값을 출력해주면 됨
cur = cur.next
linked_list = LinkedList(3)
linked_list.append(4)
linked_list.append(5)
linked_list.print_all()
느낀점
열심히 공부하는 모습 보기 좋습니다!! 진짜 공부할 내용이 많아서 힘들다는 것 공감합니다. (저도 지금...) 계속 화이팅입니다!!