algorithm 02

sung eon·2022년 8월 1일
0

Algorithm

목록 보기
3/29

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

"hello my name is sparta"

최빈값 찾기 문제

TIP:

  • 문자인지 확인하는 방법:
    파이썬 내장 함수 str.isalpha() 를 이용해서 해당 문자열이 알파벳인지 확인할 수 있다.
    • 쓰는 이유는 (스페이스) 공백은 알파벳이 아니기 때문에.
print("a".isalpha())    # True
print("1".isalpha())    # False
.
s = "abcdefg"
print(s[0].isalpha())   # True
  • 알파벳 별로 빈도수로 리스트에 저장하기:
  1. 우선 알파벳 별 빈도수를 저장하기 위해 길이사 26인 0으로 초기화된 배열을 만든다.
alphabet_occurrence_array = [0] * 26
  1. 이 배열의 각 원소에 알파벳마다 빈도수를 추가해줘야 합니다. 아스키(ASCII) 코드를 사용해 a일 때는 0번째 원소에 1을 추가하고, b일 때는 1번째 원소에 1을 추가해줘야 해준다.

  2. python to ascii code: ord 함수를 사용해서 파이썬을 아스키 코드로 바꿔준다

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

여기서 a의 ord에서 a의 ord 값을 빼면 0이다 = a는 0번째 인덱스 라는 것을 알려줄 수 있는 변환 코드이다.

따라서 b의 ord에서 a의 ord 값을 빼면 1이다 = b는 1번째 인덱스 라는 것을 알려주는 코드

TIP으로 구조를 어느정도 이해했다면, 문제 풀이로!

방법 1: 각 알파벳마다 문자열을 돌면서 몇 글자 나왔는지 확인하는 방법
예) a부터 검사를 하면 순서대로 a 를 찾아서 숫자를 세고, b를 세고•••

input = "hello my name is sparta"

def find_max_occurred_alphabet(string):
    # 이 alphabet_array에서 알파벳 하나하나 꺼내면서 input과 비교해보기 위해 alphabet_array를 만들어줬다.
    # 나온 문자가 있다면 하나씩 빈도수를 추가해서 업데이트!
    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으로 지정한 다음에
        occurrence = 0
        # for문을 돌면서
        for char in string:
            # 문자열에 있는 문자와 동일하다면
            if char == alphabet:
                # occurrence 를 하나씩 증가시킨다
                occurrence += 1
        # 만약에 occurrence가 max_occurrence 보다 크면
        if occurrence > max_occurrence:
            # max_occurrence에 occurrence를 넣고
            max_occurrence = occurrence
            # max_alphabet에 alphabet을 넣어라
            max_alphabet = alphabet

    return max_alphabet


result = find_max_occurred_alphabet(input)
print(result)

방법 2: alphabet_occurrence_array를 사용하는 방법

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
        array_index = ord(char) - ord("a")
        alphabet_occurrence_array[array_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_alphabet_index = index
            max_occurrence = alphabet_occurrence
    print(max_alphabet_index)
    return chr(max_alphabet_index + ord("a"))



result = find_max_occurred_alphabet(input)
print(result)

아스키 코드를 이용한 문자를 인덱스로 바꾸는 방법, 인덱스를 문자로 만드는 방법!
.
1. a 라는 문자를 index로 바꾸고 싶을 땐,
a → 0
.
2. a를 먼저 아스키 코드(97)로 변환했었음
a → ord(a) → 97
.
3. 그리고 ord(a)값을 빼줬었다
a → ord(a) → 97 - ord(a)
.
4. 그러면 다시 0을 a로 보내려면 어떻게 해야할까?
먼저 0에 ord(a)값을 더해줘야한다.
0 + ord(a) = 97
.
5. 97을 다시 chr 함수로 감싸주면 a 가 된다.
chr(97) = a

profile
코베베

0개의 댓글