관리 메뉴

log.Sehee

TIL / 4/4 / 프로그래머스 - 최빈값 구하기 본문

TLC - 5 ⛺/Today I Learn

TIL / 4/4 / 프로그래머스 - 최빈값 구하기

Sehe_e 2023. 4. 5. 02:58

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/120812

최빈값 구하기... 2번에 있던 문제 주제에 난이도가 장난없었다..

하지만 좋은 팀장님 덕분에 깨달음을 얻은 ㅎㅎ..

 


시도

 

백업을 안해둬서 내 새벽 동안의 시도들이 전부 날라가긴 했지만

이차원배열 / for문의 range / filter함수와 lambda식 / random 등등 내가 아는 지식은 총동원해서 풀어보려 노력했던..

애초에 그런 방식으로 접근하는 문제가 아니였다는 것을 깨달았다 ..

 


해결

 

좋은 팀장님 설명으로 ^-^,,, 문제의 해답을 알게되었다.

배열과 연관되어 있는 문제기에 range()처럼 막연히 범위를 지정하는 값으로 for문을 쓰면 시간복잡도에도 걸리겠다는 생각도 이번에서야 하게 된 것 같다.. 확실히 알고리즘 수업을 들은 효과는 있는 것 같다!

 

def solution(array):
    # 배열의 값이 1개일 수도 있다는 가정 하의 answer를 배열의 첫 원소로 지정.
    answer = array[0]
    # 배열이 2개 이상일 경우에만 while문을 돌릴 수 있게 조건을 설정.
    while len(array)>1:
        # 배열의 집합을 구하기
        set_nums = set(array)
        # 반복문으로 배열에서 집합과 중복되는 원소가 있다면 지워낸다.
        for i in set_nums:
            array.remove(i)
        # 만약 리스트가 비워진다면 최빈값이 중복되었다는 뜻. -1을 반환한다.
        if array==[]:
            answer = -1
            break
        # 만약 리스트의 원소가 1개 남았다면 그것이 최빈값, 첫 번째 원소로 지명하고 출력
        elif len(array)==1:
            answer = array[0]
            break
        return answer

그렇다.. 집합을 이용하는 방법이였던 것이다..

또다른 방법을 알려주셨지만 그건 나 혼자 구현했더니 또 시간복잡도에서 두 번.. 실패해서 ^^... 나중에 올리려고 한다..

사실 처음에 문제를 보고 최빈값을 반환하라는 것을 보고 이건 딱히 숫자의 범위 문제가 아닌, 그저 제일 많은 원소의 갯수만을 찾으면 되기에 뭔가 다른 돌파구가 있을 것 같았지만 항상 그것을 찾아내는 것이 문제 풀이의 쟁점이였기 때문에 이번에도 그 돌파구를 찾지 못해 내가 적당한 방법을 찾지 못한 것 같다. 역시 알고리즘 문제를 푸는 것은 경험과 꾸준한 노력의 차이가 큰 것 같다.

 


배운 점

 

이번에도 팀원 분께 도움을 받게 되었다!!

덕분에 내가 이해할 수 있는 함수와 지식 내에서도 충분히 풀 수 있었던 문제였지만 내 함수 활용도와 코드 작문성이 떨어진다는 것도 많이 느낄 수 있었다.. 알고리즘 전문 지식은 아직도 듣기만 해도 고루하고 질리지만.. 함수나 시간복잡도, 배열이나 퀵의 중요성은 많이 느낄 수 있었다. 내가 문제를 풀기 위해서 최소한으로는 알고 있어야 하는 지식들은 나를 위해서라도 공부하는 것이 좋겠다는 것을 다시 느낄 수 있었다!

 

 

 

Comments