[TIL #12] 알고리즘

안떽왕·2023년 4월 3일
0

Today I Learned

목록 보기
12/76

최빈값 구하기

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1return 합니다.

def solution(array):
    answer = 0
    temp_dict = {}
    max_num = 0
    for i in array:
        if i not in temp_dict:
            temp_dict[i] = 1
        else:
            temp_dict[i] += 1

    for i, m in temp_dict.items():
        if m > max_num:
            max_num = m
            answer = i
        elif max_num == m:
            answer = -1

    return answer

최빈값을 구하기 위해 생각을 해본 결과 딕셔너리를 사용하기로 했습니다. 딕셔너리에 해당 숫자와 동일한 키가 없다면 딕셔너리에 해당 숫자를 키로 갖게 하고 1을 값으로 가지게 만들었습니다. 그렇지 않은 경우에는 해당 숫자가 키로 존재한다는 의미이기 때문에 해당 숫자를 키로 갖는 값을 1만큼 상승 시켰습니다.

이후 반복문을 이용해 딕셔너리의 키와 값을 각각받아 빈도 숫자가 가장 높은 숫자가 answer에 기록되게 만들고, 만약 반복문을 돌다가 해당 빈도 수와 같은 숫자가 있었다면 answer를 -1로 변경시키게 했습니다.

후기

본래 가장 먼저 생각났던 방법은 리스트와 enumerate,max함수를 이용하는 방법이였습니다. 하지만 저번 프로젝트에서 딕셔너리의 활용이 얼마나 중요한지 배웠기 때문에 어떻게든 딕셔너리를 쓰고싶어 구상하게 된 코드였습니다. 처음엔 딕셔너리를 어떻게 써야하나 고민이 많았는데 막상 써보니 이렇게 유용한 방식을 안썼다는게 후회가 됐습니다.

배열 뒤집기

정수가 들어 있는 배열 num_list가 매개변수로 주어집니다. num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.

def solution(num_list):
    answer = []
    for i, m in enumerate(num_list, 1):
        index = len(num_list) - i
        answer.append(num_list[index])

    return answer

인덱스를 활용한 코드를 짜야겠다는 생각이 들어 시도하게됐습니다. enumerate함수를 이용해 순번과 리스트의 값을 순서대로 넣어주고 인덱스 값을 맞춰주기 위해 인자로 1을 받아 0부터가 아닌 1부터 시작하는 순번을 만들었습니다.

이후 index변수 안에 리스트의 길이 - i 즉 5개짜리의 배열을 예시로 들면 index 에는 4, 3, 2, 1, 0이 차례대로 담기고 이 값들은 순차적으로 리스트의 인덱스 역할을 맡게해 answer 리스트에 들어가도록 했습니다.

후기

상당히 짧아보이는 코드지만 의외로 시간이 조금 걸렸던 코드였습니다. 처음에는 리스트를 절반으로 나눠 정렬한 후 합치는 분할정복 방식을 고려하다가 예상 외로 빨리 코드가 생각나지 않아 저 방식으로 선회하게 되었습니다. 다음에는 분할정복 방식의 코드풀이를 다시 시도해보겠습니다.

profile
이제 막 개발 배우는 코린이

0개의 댓글