알고리즘

알고리즘과 친해지기 - 최빈값 찾기

na_o 2021. 8. 10. 02:51
728x90

문제 설명)

다음과 같은 문자열을 입력받았을 때, 어떤 알파벳이 가장 많이 포함되어 있는지 반환하시오

"hello my name is sparta"

 

힌트)

1) str.isalpha() : 문자가 알파벳인지 아닌지 반환하는 함수. return True or False

print("a".isalpha())    # True
print("1".isalpha())    # False

s = "abcdefg"
print(s[0].isalpha())   # True

 

2) 알파벳 별로 빈도수를 리스트에 저장하기

길이가 26이고 0으로 초기화된 배열을 선언한 후, 이 배열의 각 원소에 알파벳마다 빈도수를 추가

ex) 알파벳을 순서대로 나열했을 때 a는 첫번째로 등장함

     컴퓨터언어에서는 시작이 1이아닌 0이기 때문에 

     a의 위치는 0

     b -> 1, c -> 2, ... z -> 25

     a일 때는 0번째 원소에 1을 추가, b일 때는 1번째 원소에 추가, ...

그럼 위치를 얻어낼 수 있는 방법은..??

 

ASCII코드를 이용해서 위치를 얻어낼 수 있다..!

컴퓨터는 0과 1밖에 모르는 바보(?)이기 때문에 컴터가 문자를 기억하는 방법은 숫자로 기억하는 방법이다

 

odr() : 문자를 아스키코드로 변환해줌

# 내장 함수 ord() 이용해서 아스키 값 받기
print(ord('a'))               # 97
print(ord('a') - ord('a'))    # 97-97 -> 0
print(ord('b') - ord('a'))    # 98-97 -> 1

ord(알파벳) - ord('a')를 이용해 알파벳의 위치를 얻어낼 수 있음!

 

* 알파벳 빈도수 세기 *

def find_alphabet_occurrence_array(string):
    alphabet_occurrence_array = [0] * 26
    
    for alphabet in string:
        if alphabet.isalpha():                #isalpha: 알파벳인지 아닌지 판단. T/F
            index = ord(alphabet) - ord('a')  #ord: ASCII Code로 바꿔줌
            alphabet_occurrence_array[index] += 1
    return alphabet_occurrence_array


print(find_alphabet_occurrence_array("hello my name is sparta"))

#[3, 0, 0, 0, 2, 0, 0, 1, 1, 0, 0, 2, 2, 1, 1, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 0]

 


방법1)

각 알파벳마다 문자열을 돌면서 몇 글자 나왔는지 확인

만약 그 숫자가 저장한 알파벳 빈도 수보다 크면, 그 값을 저장하고 제일 큰 알파벳으로 저장

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", "x", "y", "z"]
    max_occurrence = 0			#가장 많이 나온 횟수
    max_alphabet = alphabet_array[0]	#가장 많이 나온 알파벳

    for alphabet in alphabet_array:
        occurrence = 0			#현재 알파벳에 대한 횟수
        for char in string:
            if char == alphabet:
                occurrence += 1

        if occurrence > max_occurrence:
            max_alphabet = alphabet
            max_occurrence = occurrence

    return max_alphabet


result = find_max_occurred_alphabet(input)
print(result)

#a

 

 

방법2) 

각 알파벳의 빈도수를 alphabet_occurrence_list 라는 변수에 저장

각 문자열을 돌면서 해당 문자가 알파벳인지 확인하고, 알파벳을 인덱스 화 시켜 각 알파벳의 빈도수를 업데이트

input = "hello my name is sparta"


def find_max_occurred_alphabet(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

    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
            max_alphabet_index = index
    return chr(max_alphabet_index + ord("a"))


result = find_max_occurred_alphabet(input)
print(result)

#a

 

나의 풀이)

각 알파벳의 빈도수를 alphabet_occurrence_list 라는 변수에 저장

해당 값이 저장되어있는 위치를 반환하는 index() 함수를 이용해서 위치 찾기

input = "hello my name is sparta"


def find_max_occurred_alphabet(string):
    max_count = 0                       #가장 많이 나온 횟수
    occurred_alphabet_count = [0] * 26  #등장한 횟수 값 저장하는 배열
    for alphabet in string:
        if alphabet.isalpha():
            index = ord(alphabet) - ord('a')
            occurred_alphabet_count[index] += 1

    for num in occurred_alphabet_count:
        if num > max_count:
            max_count = num
            max_index = occurred_alphabet_count.index(max_count) #index()
        ascii_num = max_index + ord('a')
    return chr(ascii_num)


result = find_max_occurred_alphabet(input)
print(result)

#a

'알고리즘' 카테고리의 다른 글

알고리즘 더 풀어보기 (1)  (0) 2021.08.17
점근 표기법  (0) 2021.08.15
공간 복잡도 판단하기  (0) 2021.08.13
시간 복잡도 판단하기  (0) 2021.08.11
알고리즘과 친해지기 - 최대값 찾기  (0) 2021.08.09