def find_max_occurred_alphabet(string): # 최대빈도 알파벳 찾기위한 함수 정의 ( 파라미터 string )
alphabet_occurrence_array = [0] * 26 # 26개의 0으로 채워진 빈 배열
for char in string: # char를 반복한다 파라미터(맨아래 문자열)에
if not char.isalpha(): # char가 알파벳이 아닌것이 참이라면
continue # for문 다음 인덱스로 진행한다 ( 문자열에서 알파벳이 아닌것을 거름)
arr_index = ord(char) - ord('a') # (char 아스키코드 - a의 아스키코드) 값을 알파벳 인덱스라 한다
alphabet_occurrence_array[arr_index] += 1 # 빈 배열의 인덱스 번째에 1을더한다 , 이 과정을 반복한다
## range 함수는 연속적인 숫자 객체를 만들어서 반환해주는 함수입니다.
## 예를 들어,range(10)을 호출하면 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 가 들어있는 반복 가능한 객체를 알아서 만들어서 반환
max_occurrence = 0 # 최대 빈도
max_alphabet_index = 0 # 최대빈도 알파벳의 인덱스
for index in range(len(alphabet_occurrence_array)): # index 를 반복한다 range(0,26)에서
alphabet_occurrence = alphabet_occurrence_array[index] # 알파벳 빈도값 = 알파벳 빈도 배열[인덱스값]
if alphabet_occurrence > max_occurrence: # if 알파벳 빈도값이 최대 빈도값보다 크다면
max_occurrence = alphabet_occurrence # 알파벳 빈도값이 최대빈도값이 된다
max_alphabet_index = index # 그 인덱스 번호 또한 최대빈도 알파벳 인덱스값이 된다 , 이것을 반복
return chr(max_alphabet_index + ord('a')) # (최대빈도알파벳 인덱스값 + a의 아스키코드를 더한값 = 최대빈도알파벳의 아스키코드)
# chr() 함수 이용해 최대빈도알파벳의 아스키코드룰 실제 알파벳으로 변환
result = find_max_occurred_alphabet
print("정답 = a 현재 풀이 값 =", result("Hello my name is sparta"))
print("정답 = a 현재 풀이 값 =", result("Sparta coding club"))
print("정답 = s 현재 풀이 값 =", result("best of best sparta"))
입력값과 문제해결 소요시간 간의 상관관계를 뜻한다
입력값의 증가에도 소요시간이 적게 증가하는 것이 좋은 알고리즘이다
입력값이란 함수에서 크기 길이가 변할수 있는 값이다
입력값의 길이를 N이라고 표현한다
ex) N은 6이고 시간복잡도가 N^2 + 33 일때 36+33이라 표현하는것이 아니라 N^2이라 표현한다
시간복잡도의 목적은 입력값과 소요시간간의 상관관계를 수식으로 표현하는것이기 때문이다
이렇게 수치로 확인하면, 얼마나 효율적인지 정량적으로 분석가능하다
입력값과 문재해결에 사용되는 공간의 상관관계를 뜻함
저장하는 데이터의 양이 = 1개의 공간을 사용하는것으로 계산한다
/ 알고리즘의 성능의 영향도
시간복잡도가 훨씬 크다
따라서 공간 복잡도를 희생해서라도 시간 복잡도에 유리한 코드를 작성해야 한다
알고리즘의 효율성 평가하는 방법이다 < 시간 공간 복잡도도 점근표기법중 하나이다
점근표기법의 종류로는 빅 오 표기법 (Big - O) / 빅 오메가 표기법(Big - Ω)이 있다
빅 오 표기법, 성능이 최악이라 생각하고 어느정도의 연산량이 걸릴지
빅 오 메가기법, 성능이 최악이라 생각하고 어느정도의 연산량이 걸릴지
알고리즘은 입력값의 분포에 따라 성능이 달라지는데, 이를 고려햐여 거의 모든 알고리즘은
두 종류 중 (Big - O) 빅 오 표기법을 사용한다
왜냐하면 대부분의 입력값이 최선일 가능성은 적고, 최악의 경우를 대비하기 위해 빅오 표기법을 사용