우기의 알 블로그 저자 한승욱이라고 합니다.
스스로 알을 깨고 나오는 새처럼
언젠가 알을 깨고 온전한 나 자신이 되었을 때, 그때를 기다리며 제 속에서 솟아 나오는 것을 글로써 표현하고자 합니다.
'개발 기술블로그'를 위주로 저 한승욱의 다양한 관심사, 생각, 철학 등을 포스팅합니다.
# 내 코드
input = [3, 5, 6, 1, 2, 4]
def find_max_num(array):
max_num = max(input)
return max_num
result = find_max_num(input)
print(result)
# 튜터 방식1
def find_max_num(array):
for num in array:
for compare_num in array:
if num < compare_num:
break
else:
return num
# 튜터 방식2
def find_max_num(array):
max_num = array[0]
for num in array:
if num > max_num:
max_num = num
return max_num
튜터의 방식 2가지 중에 어떠한 방식이 효율적인 방식일까?
본인의 생각은 1번 방식은 for문이 2번이기에 n^2, 2번 방식은 for문이 1번이기에 n일
것이다.
2번 방식일 것이다.
연습문제 2
최빈값 찾기
input = "hello my name is sparta"
def find_max_occurred_alphabet(string):
alphabet_occurrence_array = [0] * 26
# 이 부분을 채워보세요!
return alphabet_occurrence_array
result = find_max_occurred_alphabet(input)
print(result)
# 내 코드
def find_max_occurred_alphabet(string):
alphabet_occurrence_array = [0] * 26
# 이 부분을 채워보세요!
for str in string:
if str.isalpha():
alphabet_occurrence_array[ord(str) - ord('a')] += 1
max_idx = alphabet_occurrence_array.index(max(alphabet_occurrence_array))
return chr(max_idx + 97)
대부분의 문제에서는 알고리즘의 성능이 공간에 의해서 결정되지 않으므로
공간복잡도 보다는 시간복잡도를 보다 중요하게 생각해야함.
위 둘의 시간 복잡도 비교
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 + 연산1)
26 * (1 + 2 * N + 2) = 52N + 104 → 계수와 상수를 버린다
→ N만큼의 시간이 필요하다.
2.
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
albphabet_array의 길이 x (비교1 + 대입3)
N * (1+2) + 2 + 26 * (1+3) = 3N + 106 → N만큼의
시간이 필요하다.
알고리즘 1주차 - 개요/시간복잡도/공간복잡도
본 포스팅은 스파르타코딩클럽 - 알고리즘 강의를 들으며 정리한 자료입니다.
진행 순서
알고리즘 공부가 필요한 이유
알고리즘을 학습하기 위한 기본 코드 구현력
개발환경 세팅
파이참 열은 후 "새 프로젝트 클릭" → 프로젝트 저장 폴더 위치 선택 → 파이썬 3 버전 확인후 Create
각 프로젝트마다 요구되는 개발 환경(패키지 버전 등)을 독립적으로 관리하기 위해 venv라는 가상환경이 자동으로 생성되고 이곳에 환경 세팅을 함. 우리는 여기서는 사용안함.
week_1 디렉토리 생성 및 00_hello.py 라는 파일 생성
해당 문구 코딩
해당 편집기 안에서 마우스 우클릭 버튼 및 run 클릭
해당 콘솔에 이와 같이 노출된다면 성공
팁: 코드를 작성할 경우 띄어쓰기 등이 필요할 경우 언더바(_)로 대체함. 컴퓨터는 기본적으로 특수 문자를 싫어함.
연습문제 1
해당 코드 스니펫을 기반으로 리스트에서 최대값 찾기
튜터의 방식 2가지 중에 어떠한 방식이 효율적인 방식일까?
본인의 생각은 1번 방식은 for문이 2번이기에 n^2, 2번 방식은 for문이 1번이기에 n일 것이다.
2번 방식일 것이다.
연습문제 2
튜터의 방식 2가지 중에 어떠한 방식이 효율적인 방식일까?
본인의 생각은 1번 방식은 for문이 2번이기에 n^2, 2번 방식은 for문이 2번이지만 중첩되지 않기에 2n일 것이다.
(이 부분은 틀렸는지 맞는지 정확하게 모르겠다.)
2번 방식일 것이다.
시간 복잡도, 공간 복잡도
입력값과 문제를 해결하는데 걸리는 시간과의 상관관계. 입력값이 늘어나도 걸리는 시간이 덜 늘어나는 알고리즘이 좋은 것
2번의 경우가 유리하다. 위에서 상수는 버리고 입력값에 비례해서 어느 정도 증가하는지만 판단하면 됨.
예) 상수 연산량이 필요하다 → 1 만큼의 연산량이 필요하다.
입력값과 문제를 해결하는데 걸리는 공간과의 상관관계. 입력값이 늘어나도 걸리는 공간이 덜 늘어나는 알고리즘이 좋은 것
(저장하는 데이터의 양이 1개의 공간을 사용한다고 가정하고 계산)
그렇다면 공간을 더 적게 쓴 1번째 방법이 더 효율적인걸까?
아니다.
29와 30 모두 상수라 큰 상관이 없고 이때는 다시 시간 복잡도로 비교한다.
대부분의 문제에서는 알고리즘의 성능이 공간에 의해서 결정되지 않으므로 공간복잡도 보다는 시간복잡도를 보다 중요하게 생각해야함.
26 * (1 + 2 * N + 2) = 52N + 104 → 계수와 상수를 버린다 → N만큼의 시간이 필요하다.
2.
N * (1+2) + 2 + 26 * (1+3) = 3N + 106 → N만큼의 시간이 필요하다.
'기술개발 > Algorithm' 카테고리의 다른 글