우기의 알 블로그 저자 한승욱이라고 합니다.
스스로 알을 깨고 나오는 새처럼
언젠가 알을 깨고 온전한 나 자신이 되었을 때, 그때를 기다리며 제 속에서 솟아 나오는 것을 글로써 표현하고자 합니다.
'개발 기술블로그'를 위주로 저 한승욱의 다양한 관심사, 생각, 철학 등을 포스팅합니다.
다음과 같은 숫자로 이루어진 배열이 있을 때, 이 배열 내에 특정한 숫자가 존재하면 True, 존재하지 않는다면 False를 반환하기
input = [3, 5, 6, 1, 2, 4]
defis_number_exist(number, array):# 이 부분을 채워보세요!returnTrue
result = is_number_exist(3, input)
print(result)
# 내 코드defis_number_exist(number, array):if number in array:
returnTruereturnFalse
# 튜터 코드
def is_number_exist(number, array):
for element in array: # array의 길이 만큼 아래 연산 실행if number == element: # 비교 연산 1번 실행returnTrue# N*1 = N
N이 시간복잡도 이지만 무조건 N인 것은 아니다.
3이 첫번째 인덱스에 있으므로 바로 True를 반환하게 된다.
운이 좋으면 한번만 연산해도 찾을 수 있다.
반대로 운이 좋지 않으면 N만큼의 연산을 다해야 한다.
즉 입력값에 따라서 입력값의 분포에 따라서 성능이 변화할 수 있다.
O(N), Ω ( 1 ) Ω(1) Ω(1) 만큼의 시간복잡도를 가진 것이다.
대부분의 경우는 최선의 방법이 나오지 않기 때문에 모든 알고리즘을 빅오 표기법으로 분석하는 것이다.
알고리즘 더 풀어보기
곱하기 or 더하기
Q. 다음과 같이 0 혹은 양의 정수로만 이루어진 배열이 있을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 '✕' 혹은 '+' 연산자를 넣어 결과적으로 가장 큰 수를 구하는 프로그램을 작성하시오. 단, '+' 보다 '✕' 를 먼저 계산하는 일반적인 방식과는 달리, 모든 연산은 왼쪽에서 순서대로 이루어진다.
input = [0, 3, 5, 6, 1, 2, 4]
deffind_max_plus_or_multiply(array):# 이 부분을 채워보세요!return1
result = find_max_plus_or_multiply(input)
print(result)
# 내 코드
def find_max_plus_or_multiply(array):
result=0for i inrange(0, len(array)):
try: # outofrange 방지
if array[i] ==0orarray[i+1] ==0orarray[i] ==1orarray[i+1] ==1:
result+=array[i] +array[i+1]
else:
result+=array[i] *array[i+1]
except:
returnresult
# 튜터 코드
def find_max_plus_or_multiply(array):
result=0for i inrange(0, len(array)):
try:
if array[i] ==0orarray[i+1] ==0orarray[i] ==1orarray[i+1] ==1:
result+=array[i] +array[i+1]
else:
result+=array[i] *array[i+1]
except:
returnresult
튜터의 코드의 시간 복잡도는 어떻게 될까? O(N)일 것이다.
1차 반복문이 있으니 O(N)인 것이다.
반복되지 않는 문자
Q. 다음과 같이 영어로 되어 있는 문자열이 있을 때, 이 문자열에서 반복되지 않는 첫번째 문자를 반환하시오. 만약 그런 문자가 없다면 _ 를 반환하시오.
input = "abadabac"deffind_not_repeating_first_character(string):# 이 부분을 채워보세요!return"_"
result = find_not_repeating_first_character(input)
print(result)
# 내 코드def find_not_repeating_first_character(string):
dict = {}
forcharinstring:
if dict.get(char):
dict[char]=dict.get(char) + 1else:
dict[char] = 1
result = [i for i, x in dict.items() if x ==1]
return result[0]
알고리즘 1주차 - 점근표기법, 연습문제
점근표기법
알고리즘의 성능을 수학적으로 표기하는 방법 즉 알고리즘의 '효율성'을 평가하는 방법.
어떤 함수의 증가 양상을 다른 함수와의 비교로 표현하는 수론과 해석학의 방법.
이전에서 공부했던 시간복잡도와 공간복잡도도 점근 표기법의 일종.
빅오(Big-O) 표기법
최악의 성능이 나올때 어느 정도의 연산량이 걸릴 것인지 표기
빅 오메가(Big-Ω) 표기법
최선의 성능이 나올때 어느 정도의 연산량이 걸릴 것인지 표기
배열에서 특정 요소 찾기
다음과 같은 숫자로 이루어진 배열이 있을 때, 이 배열 내에 특정한 숫자가 존재하면 True, 존재하지 않는다면 False를 반환하기
input = [3, 5, 6, 1, 2, 4] def is_number_exist(number, array): # 이 부분을 채워보세요! return True result = is_number_exist(3, input) print(result)
# 내 코드 def is_number_exist(number, array): if number in array: return True return False
# 튜터 코드 def is_number_exist(number, array): for element in array: # array의 길이 만큼 아래 연산 실행 if number == element: # 비교 연산 1번 실행 return True # N*1 = N
N이 시간복잡도 이지만 무조건 N인 것은 아니다.
3이 첫번째 인덱스에 있으므로 바로 True를 반환하게 된다.
운이 좋으면 한번만 연산해도 찾을 수 있다.
반대로 운이 좋지 않으면 N만큼의 연산을 다해야 한다.
즉 입력값에 따라서 입력값의 분포에 따라서 성능이 변화할 수 있다.
O(N), Ω ( 1 ) Ω(1) Ω(1) 만큼의 시간복잡도를 가진 것이다.
대부분의 경우는 최선의 방법이 나오지 않기 때문에 모든 알고리즘을 빅오 표기법으로 분석하는 것이다.
알고리즘 더 풀어보기
곱하기 or 더하기
Q. 다음과 같이 0 혹은 양의 정수로만 이루어진 배열이 있을 때, 왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 '✕' 혹은 '+' 연산자를 넣어 결과적으로 가장 큰 수를 구하는 프로그램을 작성하시오. 단, '+' 보다 '✕' 를 먼저 계산하는 일반적인 방식과는 달리, 모든 연산은 왼쪽에서 순서대로 이루어진다.
input = [0, 3, 5, 6, 1, 2, 4] def find_max_plus_or_multiply(array): # 이 부분을 채워보세요! return 1 result = find_max_plus_or_multiply(input) print(result)
# 내 코드 def find_max_plus_or_multiply(array): result = 0 for i in range(0, len(array)): try: # outofrange 방지 if array[i] == 0 or array[i+1] == 0 or array[i] == 1 or array[i+1] == 1: result += array[i] + array[i+1] else: result += array[i] * array[i+1] except: return result
# 튜터 코드 def find_max_plus_or_multiply(array): result = 0 for i in range(0, len(array)): try: if array[i] == 0 or array[i+1] == 0 or array[i] == 1 or array[i+1] == 1: result += array[i] + array[i+1] else: result += array[i] * array[i+1] except: return result
튜터의 코드의 시간 복잡도는 어떻게 될까? O(N)일 것이다.
1차 반복문이 있으니 O(N)인 것이다.
반복되지 않는 문자
Q. 다음과 같이 영어로 되어 있는 문자열이 있을 때, 이 문자열에서 반복되지 않는 첫번째 문자를 반환하시오. 만약 그런 문자가 없다면 _ 를 반환하시오.
input = "abadabac" def find_not_repeating_first_character(string): # 이 부분을 채워보세요! return "_" result = find_not_repeating_first_character(input) print(result)
# 내 코드 def find_not_repeating_first_character(string): dict = {} for char in string: if dict.get(char): dict[char]=dict.get(char) + 1 else: dict[char] = 1 result = [i for i, x in dict.items() if x ==1] return result[0]
# 튜터 코드 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_occurence = alphabet_occurrence_array[index] if alphabet_occurence == 1: not_repeating_character_array.append(chr(index + ord("a"))) for char in string: if char in not_repeating_character_array: return char
튜터의 코드는 for이 3개 이므로 3N이려나 N^3 이려나..........정확하게 모르겠어서 튜터분에게 여쭤본 상황이다.
(3N이 정답이다! 내 생각이 맞았다)
'기술개발 > Algorithm' 카테고리의 다른 글