프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
def solution(array):
count = [0] * (max(array)+1) # 숫자 출연 횟수를 셀 리스트
for i in array:
count[i] += 1
m = 0 # 최빈값의 개수
for c in count:
if c == max(count):
m += 1
if m > 1: # 최빈값이 2개 이상이면 -1을 리턴
return -1
else: # 최빈값이 1개이면 해당 숫자를 리턴
return count.index(max(count))
주어진 배열에서 최빈값을 찾는 문제이다.
최빈값을 찾기 위해 배열의 각 요소가 몇 번 등장했는지 세는 count 리스트를 만들었다.
max(array)에 +1을 하는 이유는 array에서 가장 큰 값까지 개수를 세기 위함이다.
예를 들어 array의 최댓값이 4라고 했을 때, [0] * max(array)를 하면 리스트는 인덱스 0부터 시작하기 때문에 마지막 인덱스는 max(array)인 4가 아닌 3이 된다.
그렇기 때문에 max(array)+1을 하여 0부터 4까지의 인덱스를 가지게 해주어야 한다.
그 다음은 array의 각 요소가 몇 번 등장했는지 세는 for 문이다.
만약, array의 요소가 1이라면 count에서 1번 인덱스에 +1을 하는 과정을 array을 돌며 반복하는 것이다.
문제에서 최빈값이 2개 이상이면 -1을 리턴하라고 했기 때문에 최빈값이 몇 개인지 세는 과정이 필요하다.
최빈값의 갯수를 저장할 m이라는 변수를 0으로 초기화하고 count 리스트를 돌며 count의 최댓값과 같은 값이 있으면 m+1을 한다.
m > 1이면 최빈값이 2개 이상인 것이므로 -1을 리턴하고, 그렇지 않으면 최빈값의 count 인덱스 번호(= array에서 가장 많이 등장한 숫자)를 찾아 리턴한다.
다른 사람의 코드
def solution(array):
while len(array) != 0:
for i, a in enumerate(set(array)):
array.remove(a)
if i == 0: return a
return -1
가장 좋아요를 많이 받은 코드이다. 보자마자 이렇게 간단하게 된다고? 하며 놀랐다.
직접 종이에 써서 요소를 하나씩 지워보니 이해가 되었다. 이해한 대로 과정을 작성해 보았다.
프로그래머스에서 주어지는 예시는 다음과 같다.
1) [1, 2, 3, 3, 3, 4]
2) [1, 1, 2, 2]
3) [1]
1) [1, 2, 3, 3, 3, 4]
array의 길이가 0이 아닐 때(= array에 요소가 남아 있을 때)까지 set(array)의 요소(a)를 지워가는 과정을 반복한다.
array = [1, 2, 3, 3, 3, 4] 이면 set(array)는 (1, 2, 3, 4) 이다.
enumerate는 인덱스와 요소를 같이 반환하므로 위 코드에서 i는 인덱스, a가 요소가 된다.
i=0, a=1 → array에서 a(= 1) 제거 → array [2, 3, 3, 3, 4]
i=1, a=2 → array에서 a(= 2) 제거 → array [3, 3, 3, 4]
i=2, a=3 → array에서 a(= 3) 제거 → array [3, 3, 4]
i=3, a=4 → array에서 a(= 4) 제거 → array [3, 3]
그럼 현재 i는 3이므로 if 조건문이 참이 아니고, array의 길이도 0이 아니므로 다시 for문을 반복한다.
현재 array는 [3, 3] 이고 set(array)는 (3) 이다.
i=0, a=3 → array에서 a(= 3) 제거 → array [3]
i=0이다. if 조건문을 만족한다. 그러므로 a(= 3)을 리턴한다.
따라서 [1, 2, 3, 3, 3, 4] 에서 최빈값은 3이다.
2) [1, 1, 2, 2]
array = [1, 1, 2, 2] 이면 set(array)는 (1, 2) 이다.
i=0, a=1 → array에서 a(= 1) 제거 → array [1, 2, 2]
i=1, a=2 → array에서 a(= 2) 제거 → array [1, 2]
그럼 현재 i는 1이므로 if 조건문이 참이 아니고, array의 길이도 0이 아니므로 다시 for문을 반복한다.
현재 array는 [1, 2] 이고 set(array)는 (1, 2) 이다.
i=0, a=1 → array에서 a(= 1) 제거 → array [2]
i=1, a=2 → array에서 a(= 2) 제거 → array [ ]
array의 모든 요소가 삭제되었다.
이때 i는 1이므로 if 조건문에 참이 아니다. 그러므로 다시 while문으로 돌아간다.
하지만 array의 길이가 0이므로 while문 조건에도 부합하지 않는다. 따라서 while문을 탈출하고 -1을 리턴한다.
3) [1]
array = [1] 이면 set(array)는 (1) 이다.
i=0, a=1 → array에서 a(= 1) 제거 → array [ ]
i가 0이다. if 조건문에 참이 되므로 a(= 1)을 리턴한다.
따라서 [1] 에서 최빈값은 1이다.