Python - Algorithm 코드 전개순서 최댓값 찾기, 알파벳 빈도수 찾기

2022. 11. 22. 14:22Python/Algorithm

728x90
  • 함수 호출시 코드의 흐름
    • 함수 호출시 어떻게 코드가 전개되는건지 헷갈리시지는 않나요? 다시 한번 코드의 흐름을 복기해볼게요!
      1. 함수 calculateAvg를 호출하면서 변수 priceA와 priceB를 매개변수로 전달
      2. 함수 calculateAvg의 바디 코드가 실행됨. 이 때 1번에서 전달한 매개변수의 값이 함수를 선언할 때 썼던 매개변수명인 price1, price2에 할당되었다고 보면 됨
      3. 함수의 바디 코드가 최종적으로 변수 avg를 리턴하고 있고, 이것이 변수 avg1에 할당됨
function calculateAvg(price1, price2, price3) {
	const avg = (price1 + price2 + price3) / 3
	return avg
}

const priceA = 1000
const priceB = 2000
const priceC = 3000
const avg = calculateAvg(priceA, priceB, priceC)
console.log(`평균가격: ${avg}`)

 

 

최댓값 찾기

 

1번째방법

# 이 함수는 find_max_num이 다른 숫자들과 비교하는 방식으로 풀어짐
# 3부터 시작해서 5,6,1,2,4와 비교하고
# 3과 5를 비교, 3이 작음 바로 False, 5로 넘어감 5와 3을 비교 5가 더 큼, 5와 6 비교 Fasle, 6부터 시작
# 6과 3을 비교, 5과 비교, 6과 1 6과 2 6과 4를 비교했을때 6이 제일 컸었음 = 이 배열의 최댓값임
# 마지막 num으로써 반환됨.

input = [3, 5, 6, 1, 2, 4]


def find_max_num(array):
    for num in array:
        for compare_num in array:
            if num < compare_num:
                break
        else:
            return num


result = find_max_num(input)
print(result)

작동순서는 아래와 같다. (return 1 까먹고 안지움)

 

2번째방법

모든 값을 비교하며 지나가고 최댓값일 경우 max_num은 받아왔던 num값이 되며

 배열의 끝까지 비교해나며 다 돌았을경우 최대값을 max_num에 담아 최종 값을 리턴함 

#find_max_num 이라는 함수를 구현할 방법은 지정 변수로 구현함
#max_num이라는 변수를 설정후 가장 큰 녀석을 기록하도록 함
# 3, 5 비교시 5가 더 크니 max_num에 담기고, 
# 5, 6 비교시 6이 더 크니 다시 max_num에 담기고
# 1, 6 .. 중략
# 2, 6
# 4, 6 비교시 6이 더크니 현상 유지 하는데 배열의 갯수만큼 다 돌았으니 
# max_num을 return값에 넣어 반환해줌.



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)

 

 

 

제일 많이나온 알파벳 찾기

1번째 방법

이놈은 더 사악하다[?]

# for문을 이용하여 알파벳을 하나하나 꺼내서 문자열에 있는 문자와 동일하다면 occurrence를 하나씩 증가시켜
# max_occurence를 증가하는 방식의 코드
#이는 알파벳마다 문자열을 돌며 몇 글자 나오는지 확인하는 방법
#a -> 3
#b -> 0 ....

#alaphabet_array에 다 적어넣은 이유? -> a랑 이 문자열이랑 비교해줘야되기때문에.
#이 alphabet_array에서 하나하나 꺼내어 input과 비교를 할것임.

#나온 문자가 있다면 하나씩 빈도수를 업데이트를 가장 최고가 나오는 값을 반환하는 방식으로.
#최고로 많이 나온 변수의 빈도를 저장하는 함수 max_occuurence, 최고로 많이 나온 알파벳을 저장하기위한 변수 두가지가 필요함 max_alphabet
#0번째 있는 원소를 넣고 for문을 돌며 몇번이나 나온지 확인함
#alphabet_array에서  alphabet이라는 변수에 하나하나 원소를 담아주고
# occurence라는 변수를 0으로 지정후 for문을 돌며 만약 이떄 char가 alphabet과 동일하다면
# occurence는 하나씩 증가된다.
# 만약 occurence가 max_occurence보다 크다면 max_occurence에 occurence를 넣고
# max_alphabet에 alphabet을 넣어준다.



#
input = "hello my name is sparta"


def find_max_occurred_alphabet(string):
    for char in string:
        alphabet_array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
                          "n", "o", "p", "q", "r", "s", "t", "u", "q", "r", "w", "x", "y", "z"]
        max_occurrence = 0
        max_alphabet = alphabet_array[0]

        for alphbet in alphabet_array:
            occurrence = 0
            for char in string:
                if char == alphbet:
                    occurrence +=1
            if occurrence > max_occurrence:
                max_occurrence = occurrence
                max_alphabet = alphbet
    # 이 부분을 채워보세요!
    return max_alphabet


result = find_max_occurred_alphabet(input)
print(result)

 

2번째 방법

머리가 나쁜지 이해하는데 한참 걸렸다.

#먼저 배열을 0을 넣은 알파벳의 갯수(26개)만큼 초기화 하여 선언함
#for문을 작성하는데,char라는 변수(0)에 string의 갯수만큼 돌겠다는 얘기이다.
# 이는 문자열이 하나하나씩 담기게 해주는 for문임.
#만약 입력된 문장값이 알파벳이 아니라면 for문의 다음 인덱스로 넘어가 계속 돌며
#이때 문장값이 알파벳이라면 입력된 알파벳의 아스키코드값에서 a의 아스키코드값(97)을 빼서
#(예:s의 아스키코드값(115)에서 a의 아스키코드값(97)을 뺌, 답인 18번째 배열에 +1을 추가해준다.)
#이렇게 총 배열의 인덱스만큼을 돌고나면 배열에서 가장 높은 숫자(현재 문장에서는 a가 3으로 제일 높다)
#를 다시 배열의 인덱스의 범위만큼 돌며 숫자들을 비교해나간다.
#0~25번째 인덱스를 다 돌았을때 마지막 남은 가장 높은 인덱스의 번호
# (여기서는 a이니 max_alphabet_index는 0이고, 이때 a의 아스키값을 더하여 가장 많이 나온 알파벳의 아스키코드를 구한다.)
#그런 후에 나온 아스키코드(여기서는97)을 반환하는데, 이때 97은 a 이므로
#chr(max_alphabet_index + ord("a"))에서 97과 0을 더하여 반환하게 되는데
#chr(97)이 되므로 문자열 'a'를 반환한다.
#마지막으로 이 값은 return값에 담기게되며 이 값은 result에 'a' 라는 값으로 print에 의해 출력된다


input = "hello my name is sparta"


def find_max_occurred_alphabet(string):
    alphabet_occurrence_array = [0] * 26

    for char in string:  # 문자열이 하나하나씩 담기게 해주는 for 문
        if not char.isalpha():
            continue
        arr_index = ord(char) - ord("a")
        alphabet_occurrence_array[arr_index] += 1
    max_occurrence = 0
    max_alphabet_index = 0
    for index in range(len(alphabet_occurrence_array)):
        alphabet_occurrence = alphabet_occurrence_array[index]
        if alphabet_occurrence > max_occurrence:
            max_occurrence = alphabet_occurrence
    return chr(max_alphabet_index + ord("a"))

result = find_max_occurred_alphabet(input)
print(result)