초보 개발자

1주차 최대값,최빈값 본문

AI 웹개발 트랙 - 내배캠/1주차

1주차 최대값,최빈값

taehyeki 2021. 12. 19. 21:59

최대값

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

이 input에서 제일 큰 값을 찾는 로직을 만들어라!

 

보자 마자 떠오른 첫 번째 방법

def find_max_num(array):
    a = 0
    for i in array:
        if i>a:
            a = i
    return a


result = find_max_num(input)
print(result)

ddddddddddddddddddd이 방법이다.

a라는 숫자를 하나 정해놓고 for 반복문을 사용해서 첫 번째 요소인 3이 a(현재 0)보다 크니까 a에는 3이라는 값이 들어가고 그 다음 5라는 값이 3(현재 a) 보다 크니까 a에는 5가 들어가고 6이 5(현재 a)보다 크니까 6이 a에 들어가고 1이 6(현재 a)보다 작으니까 안들어가고... 이런식으로 가다보면 마지막에 a에는 가장 큰 값이 들어있을 것이기 때문이다.

 

그 다음 방법은 for를 2번 사용하는 방법이다.

def find_max_num(array):
    for fix in array:
        for i in array:
            if fix < i:
                break
            if i == array[-1]:
                return fix

3(fix)과 3,5,6,1,2,4를 각각 비교하고 5(fix)와 3,5,6,1,2,4를 각각 비교해 나가면서 fix의 값보다 큰 값이 존재하면 반복문을 탈출하고 마약 i가 전부 다 돌았을 때 fix의 break를 탈출하지 않는다면 fix는 최대 값이된다고 생각했다.

 

그 다음은 flag를 사용하는 방법이다.

def find_max_num(array):
    for fix in array:
        flag = 0
        for i in array:
            if fix < i:
                flag = 1
                break
        if flag == 0:
            return fix

두 번째 방법과 거의 유사하다.

fix가 돌 때마다 flag에는 0의 값이 들어가고 자기 자신보다 큰 값이 존재하면 flag에 1을 집어넣고 break한다 그리고 if문으로 flag가 0이라면 fix를 출력하라 라고 하였다. flag가 0이라는 것은 fix보다 큰 값이 없었다라는 점을 의미하기 때문이다.

 

선생님은 풀이 방법 2가지를 알려주셨다. 하나는 아래와 같고, 나머지 하나는 내가 생각한 첫 번째 방법이었다.

def find_max_num(array):
    a = 0
    for num in array:
        for compare_num in array:
        	if num < compare_num
            		break
        else:
        	return fix

처음에 else자리가 이상하길래 잘 못 쓰신건가 했는데 for와 함께 쓰는 else는, for문이 중간에 break 등으로 끊기지 않고,끝까지 수행 되었을 때 수행하는 코드라고 한다.  내가 풀었던 두 번째 세 번째 방법도 for else를 사용하면 깔끔하게 해결 할 수 있는 부분이라는 것을 배웠다.

 

최빈값

input = "hello my name is sparta"

input에 있는 알파벳 중에 가장 많이 나온 알파벳을 구하라!라는 문제이다.

 

def find_max_occurred_alphabet(string):
    lists = [0]*26
    for i in string:
        if i.isalpha():
            lists[ord(i) - ord('a')] += 1

    return chr(lists.index(max(lists))+97)


result = find_max_occurred_alphabet(input)
print(result)

이렇게 풀었다. 먼저 이걸 풀기 위해서는 아스키코드라는 것을 알아야한다.

컴퓨터는 숫자 0과 1 밖에 모르기 때문에 문자 역시 숫자로 기억한다. 이때, 어떤 숫자와 어떤 문자를 대응시키는가에 따라 여러 가지 인코딩 방식이 있는데 통상 아스키 코드 방식을 많이 사용한다고 한다. 

숫자 65는 'A'를 뜻하고 97은 'a'를 뜻한다. 이걸 숫자를 문자로, 문자를 숫자로 변환하기 위해서는

ord('a') -> 97
chr(97) -> 'a'

이 내장함수를 사용하면 된다. 따라서 알파벳이 총 26자이니까 개수만큼 배열을 만든 후 a는 0번째 인덱스 b는 1번째 인덱스로 두어 a가 나오면 0번째 인덱스에 1을 추가해주는 방식으로 lists를 만들었다. 그리고 isalpha()라는 매소드를 사용하였는데 공백이 나올 경우는 생략하기 위해서이다. 그리고 index함수를 활용해서 가장큰 값의 index를 찾고 거기에 97('a'의 아스키 코드)를 더해 나온 숫자가 제일 많이 나온 알파벳의 아스키코드 값이다. 따라서 이 값을 chr을 사용하여 문자로 만들어 주면 제일 많이 나온 알파벳이 출력이 된다.

 

선생님은 index,max등 내장함수를 쓰지않고 일일이 구현했는데 알고리즘에서는 내장함수를 사용하면 안되나??

무튼 index는 len(lists)를 for로 돌려서 처음 최대값을 구현했을 때와 마찬가지로 lists[i]의 값의 최대값을 찾아 그 i를 구하면 index를 구하는 방식을 사용했다.

 

 

근데 여기서 의문점이 만약 max의 값이 동일값이 있다면 ??  어떻게 해결해야 할까.. 하다가 어거지로 생각해내긴 했다.

input = "hello bbb my name is sparta"


def find_max_occurred_alphabet(string):
    lists = [0]*26
    for i in string:
        if i.isalpha():
            lists[ord(i) - ord('a')] += 1
    max_num = max(lists)
    max_index = lists.index(max_num)
    max_list = []
    max_list.append(max_index)
    try:
        i = 0
        while True:
            next = lists.index(max_num, max_list[i] + 1)
            max_list.append(next)
            i += 1
    except:
        ""
    max_str_list = [ chr(i+97) for i in max_list]
    return max_str_list


result = find_max_occurred_alphabet(input)
print(result)

input에 bbb를 추가해서 원래 a가 3개이므로 max값은 3인데 b또한 3개를 추가해줘서 동수(2개)로 맞추었다.

먼저 max(lists)를 통해서 3이라는 값이 max_num에 들어가고 max_index는 첫 번째 3의 index의 값이다.

최빈값이 여러개일 경우 집어 넣어 주려고 max_list을 만들었다. max_index를 max_list에 집어 넣고 try except를 사용하였다.

왜 사용했냐면 lists.index는 찾는 값이 없다면 ValueError를 발생시키기 때문에 error가 발생하면 except로 빠지도록 하여 프로그램이 죽지 않도록 하였다. 그리고  While문을 활용하여서 max_index 바로 뒤부터 발견이 되면 그 index값을 max_list에 추가하고 i의 숫자를 높여 반복하는 형태로 하였다. 여기서  없다면 오류가 발생하여 except문으로 빠지고 이를 리스트 컴프리헨션을 사용하여 max_str_list에 넣어 return해주었다.

'AI 웹개발 트랙 - 내배캠 > 1주차' 카테고리의 다른 글

1주차 곱하거나 더하기, 반복되지 않는 문자  (0) 2021.12.20
1주차 WIL  (0) 2021.12.19
타임어택 구현 4  (0) 2021.12.18
타임어택 구현 3  (0) 2021.12.17
타임어택 구현 2  (0) 2021.12.17