나의 접근 방법 (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
- 0을 담을 0번째 인덱스, 1을 담을 1번 인덱스 ....
결국, 중간 중간 7과 8이 입력값에 없다 할지라도
만약 최대값이 9라면 10개의 공간만 필요하다 (0을 포함해서)
arr = [0 for i in range(max(array)+1)]
- 현재 탐색하는 값이 0 이라면 arr[0] 1 증가
- 현재 탐색하는 값이 1 이라면 arr[1] 1 증가
- 현재 탐색하는 값이 2 이라면 arr[2] 1 증가
....(입력받은 배열의 길이만큼 탐색)
for i in array:
arr[i] += 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을 반환한다.