스파르타코딩클럽 내일배움캠프 Node.js반 알고리즘 강의 1주차 및 특강
Q. 다음과 같이 숫자로 이루어진 배열이 있을 때, 이 배열 내에서 가장 큰 수를 반환.
input = [3, 5, 6, 1, 2, 4]
def find_max_num(array):
max_num = array[0]
for num in array:
if num > max_num:
max_num = num
return max_num
result = find_max_num(input)
print(result)
입력받은 리스트의 맨 처음 숫자를 최댓값으로 초기화를 한 후, 리스트를 돌면서 현재 최댓값과 비교를 하고,
더 큰 수를 최댓값으로 설정해주는 기본적인 방법이다.
Q. 다음과 같은 문자열을 입력받았을 때, 어떤 알파벳이 가장 많이 포함되어 있는지 반환.
# 내가 작성한 코드
input = "hello my name is sparta"
def find_max_occurred_alphabet(string):
alphabet_array = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
alphabet_count_list = [0] * 26
for char in string :
if not char.isalpha():
continue
idx = ord(char) - ord('a')
alphabet_count_list[idx] += 1
for num in alphabet_count_list :
for compare_num in alphabet_count_list :
if num < compare_num:
break
else:
max = num
alphabet_array_index = alphabet_count_list.index(max)
return alphabet_array[alphabet_array_index]
result = find_max_occurred_alphabet(input)
print(result)
나는 입력받은 문자열의 알파벳의 빈도수를 저장하는 배열을 만들고, 빈도수를 다 저장한 다음,
빈도수를 저장한 배열을 중첩으로 돌면서 최댓값을 찾아,
그 최댓값의 해당하는 알파벳을 알파벳을 반환하는 방법을 생각하여 작성하였다.
하지만, 해설을 들으니
내가 작성한 코드는 불필요한 부분이 좀 많이 들어가있다는 것을 알았다.
최댓값을 찾을 때에도 반복문을 한번만 쓸수도 있고,
내장함수 chr()을 사용하여 다시 문자로 변환할 수도 있어서 알파벳 배열을 선언하지 않아도 되었었다.
상수는 큰 상관이 없다.
대부분의 알고리즘의 성능은 공간에 의해서 결정되지 않는다.
따라서, 공간 복잡도 보다는 시간 복잡도를 신경 써야 한다.
알고리즘에서는 거의 모든 알고리즘이 빅 오 표기법으로 분석.
대부분의 입력값이 최선의 경우일 때가 잘 없기 때문.
Q. 정수를 입력 했을 때, 그 정수 이하의 소수 모두 반환
input = 20
def find_prime_list_under_number(number):
list = []
# 2 ~ number까지 반복
for num in range(2, number):
isPrime = True # 소수인지 확인하는 트리거
# 2는 무조건 소수
if num == 2 :
list.append(num)
continue
for i in range(2, num):
# 2부터 자신까지 중에 자신이외의 수로 나누어지면 소수가 아니다
if num % i == 0:
isPrime = False # 소수가 아니면 판별하는 반복문을 빠져나가고 isPrime 을 False로 만든다
break
# 위의 판별하는 반복문을 돌고 나와서도 isPrime 이 true이면 리스트에 소수를 넣는다
if isPrime == True:
list.append(num);
return list
result = find_prime_list_under_number(input)
print(result)
오늘 특강을 듣고 python 에서는 카멜케이스 말고 스네이크 형식을 쓴다고 한다.
isPrime 을 is_prime 으로 쓰도록 하자.
Q. 0혹은 1로만 이루어진 문자열이 주어졌을 때, 문자를 모두 0, 혹은 모두 1로 같게 만들자. 이때 모두 0 혹은 1로 만드는 최소 횟수를 구하라
input = "011110"
def find_count_to_turn_out_to_all_zero_or_all_one(string):
count_to_all_zero = 0
count_to_all_one = 0
current_char = string[0]
if current_char == '0':
count_to_all_one += 1
elif current_char == '1':
count_to_all_zero += 1
# 하나씩 돌아가면서 판별
for char in string :
if current_char != char:
if char == '0':
count_to_all_one += 1
current_char = char
if char == '1':
count_to_all_zero += 1
current_char = char
return min(count_to_all_one, count_to_all_zero)
result = find_count_to_turn_out_to_all_zero_or_all_one(input)
print(result)
솔직히 문제 자체가 이해가 잘 되지않았다.
아직 많이 어렵다..