최빈값 구하기

손성수·2023년 3월 29일
1

알고리즘

목록 보기
7/10

최빈값 구하기

  • 나의 접근 방법 (1 - 정답아님)

    • 배열의 길이 만큼 -1로 초기환 리스트를 생성한다.
    • n번 인덱스 리스트에, n값과 일치한 값을 대입한다.
    • 최대값을 탐색하고
    • 최대값과 일치하고, 최대값과 일치한 값이 몇개인지 판단한다.
    • 일치하는 값이 없다면, 최대값의 인덱스를 반환하고
    • 일치하는 값이 있다면, -1을 반환한다.
  • 나의 첫번재 풀이 (오답)

def son(arr):
    result = [-1]*100
    for i in range(100):
        result[i] = arr.count(i)
    max_ = max(result)
    check = 0
    cnt = 0
    for i in range(100):
        if max_ == result[i]:
            cnt += 1
            check = i
        if cnt > 1 : return -1
    return check


어떤 반례가 있는 것 같은데,
반례를 찾아 여러 값을 입력해도 반례를 찾지 못해서
코드를 갈아 엎었다.



  • 나의 두번째 풀이 (정답)
def solution(array):
    #입력받은 배열의 최대값 만큼, 모든 리스트를 0으로 초기화 한다.
    arr = [0 for i in range(max(array)+1)]

    # 해당하는 인덱스의 값을 추가한다.
    for i in array:
        arr[i] += 1

    # 최대값과, 최대값의 인덱스를 구하고
    check = max(arr)
    index = arr.index(check)

    # 최대값과 같은 값이 있는지 탐색한다.
    for i in range(len(arr)):
        if i != index and arr[i] == check:
            return -1

    # 탐색결과 같은 값이 없다면, 최대값의 인덱스를 반환한다.
    return index

접근방법

  1. 배열의 초기값 설정
    • 0을 담을 0번째 인덱스, 1을 담을 1번 인덱스 ....
      결국, 중간 중간 7과 8이 입력값에 없다 할지라도
      만약 최대값이 9라면 10개의 공간만 필요하다 (0을 포함해서)
    arr = [0 for i in range(max(array)+1)] 

  2. 해당하는 값을, 값과 일치하는 리스트의 인덱스를 1씩 증가
    • 현재 탐색하는 값이 0 이라면 arr[0] 1 증가
    • 현재 탐색하는 값이 1 이라면 arr[1] 1 증가
    • 현재 탐색하는 값이 2 이라면 arr[2] 1 증가
      ....(입력받은 배열의 길이만큼 탐색)
for i in array:
        arr[i] += 1

  1. 문제의 조건, 최빈값이 여러개일경우 -1을 반환한다.

    가령,[0,1,1,2,2]의 경우
    1은 두 개, 2는 두 개 있으니,
    1의 최빈값은 2
    2의 최빈값은 2 이므로,
    문제의 조건에따라 -1을 반환한다.

    # 최대값과, 최대값의 인덱스를 구하고
       check = max(arr)
       index = arr.index(check)
    
       # 최대값과 같은 값이 있는지 탐색한다.
       for i in range(len(arr)):
           if i != index and arr[i] == check:
               return -1

    index를 찾는 함수를 통해, 최대값을 탐색하고
    반복문을 통해 탐색하며
    조건문, 최대값과 일치하면서, 기존의 인덱스값과 다르다면
    중복된 최대값이 있다는것이므로 -1을 반환한다.

profile
더 노력하겠습니다

0개의 댓글

Powered by GraphCDN, the GraphQL CDN