얼음녹차의 블로그
article thumbnail

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

카운터와 정렬을 이용함으로써 내 코드보다 깔끔하고 보기 좋게 정리되었다.

profile

얼음녹차의 블로그

@PERIR

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!