1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/120812
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 처음 작성한 코드
- 딕셔너리를 이용해 숫자를 누적시키며 조건을 확인하는 코드이다.
- 빈 딕셔너리, 최빈값과 그 값, 중복 확인 플래그를 설정해 준다.
- 어레이에 있는 n마다 다음과 같은 프로세스를 따른다.
- 딕셔너리에 n이 없다면 n을 키로 가지는 쌍을 생성해 준다.
- 키 n의 값에 1을 더해준다.
- 키 값이 현재까지의 최빈값보다 크다면 갱신해 주고 값의 인덱스를 n으로 갱신해 준다. 또한 중복 확인 플래그도 초기화시켜준다.
- 만약 키 값이 현재까지의 최빈값과 같다면 중복이 되므로 중복 확인 플래그를 True로 설정한다.
- 모든 n을 체크해 준다면 중복 확인 플래그가 False일 경우에 최빈값의 인덱스를 반환한다.
<python />
def solution(array):
dic_tmp = {}
max_value, max_index = 0, 0
duple_flg = False
for n in array:
if n not in dic_tmp:
dic_tmp[n] = 0
dic_tmp[n] += 1
if dic_tmp[n] > max_value:
max_value = dic_tmp[n]
max_index = n
duple_flg = False
elif dic_tmp[n] == max_value:
duple_flg = True
return -1 if duple_flg else max_index
# 입출력 예시
print(solution([1, 2, 3, 3, 3, 4]))
print(solution([1, 1, 2, 2]))
print(solution([1]))
3. 다른 코드
[코드1]
- 값들을 하나씩 제거함으로써 중복과 최빈값을 체크하는 방법이다.
- array의 요소값이 0이 될 때까지 루프문을 수행한다.
- set(array)를 수행하면 array에서 숫자의 중복이 사라진 요소값들만 남게 된다.
- 이러한 숫자들을 한 번씩 array에서 제거해 준다.
- 만약 숫자의 종류가 하나만 남게 된다면 set(array)를 이용한 루프문은 첫 번째에서 끝나므로 i는 0이 된다.
- 이러한 조건을 만족시키면 최빈값은 n이 된다.
- 루프문이 끝날 때까지 i가 0이 되지 않는다면 마지막까지 숫자의 종류가 하나 이상이기 때문에 중복을 의미하게 되고, 이는 -1을 반환하게 된다.
<python />
def solution(array):
i, n = 0, 0
while len(array) != 0:
for i, n in enumerate(set(array)):
array.remove(n)
if i == 0:
return n
return -1
매 루프마다 set 함수를 이용하긴 하지만 매우 보기 좋은 코드라 생각한다.
[코드2]
- 조건부 정렬을 이용한 방법이다.
- collections 라이브러리의 Counter 함수를 이용해서 빈도값에 대한 딕셔너리를 생성해 줄 수 있다.
- 딕셔너리를 값에 대해 내림차순으로 정렬해 준다.
- 키값쌍 중에 x[1]을 통해 값을 불러오고 -를 붙여줌으로써 내림차순으로 정렬할 수 있다. 이러한 방법이 싫다면 뒤에 reverse=True를 붙여주자
- 중복이 있는지 확인하기 전에 딕셔너리의 길이가 1이라면 중복이 없다는 의미이므로 바로 첫 번째 키 값을 반환한다.
- 딕셔너리의 길이가 1보다 길다면 첫 번째와 두 번째 값을 비교하고 중복되지 않는다면 키 값을 반환, 중복된다면 -1을 반환한다.
<python />
from collections import Counter
def solution(array):
cnt_dic = Counter(array).items()
li = sorted(cnt_dic, key=lambda x: -x[1])
if len(li) == 1:
return li[0][0]
return li[0][0] if li[0][1] != li[1][1] else -1
카운터와 정렬을 이용함으로써 내 코드보다 깔끔하고 보기 좋게 정리되었다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Programmers][Python] 옹알이 (2) (0) | 2023.03.13 |
---|---|
[Programmers][Python] 크기가 작은 부분 문자열 (0) | 2023.03.10 |
[Programmers][Python] 분수의 덧셈 (0) | 2023.03.08 |
[Programmers][Python] 옹알이 (1) (0) | 2023.03.08 |
[Programmers][Python] 특이한 정렬 (0) | 2023.03.08 |