log.Sehee
TIL / 4/4 / 프로그래머스 - 최빈값 구하기 본문
문제
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
그렇다.. 집합을 이용하는 방법이였던 것이다..
또다른 방법을 알려주셨지만 그건 나 혼자 구현했더니 또 시간복잡도에서 두 번.. 실패해서 ^^... 나중에 올리려고 한다..
사실 처음에 문제를 보고 최빈값을 반환하라는 것을 보고 이건 딱히 숫자의 범위 문제가 아닌, 그저 제일 많은 원소의 갯수만을 찾으면 되기에 뭔가 다른 돌파구가 있을 것 같았지만 항상 그것을 찾아내는 것이 문제 풀이의 쟁점이였기 때문에 이번에도 그 돌파구를 찾지 못해 내가 적당한 방법을 찾지 못한 것 같다. 역시 알고리즘 문제를 푸는 것은 경험과 꾸준한 노력의 차이가 큰 것 같다.
배운 점
이번에도 팀원 분께 도움을 받게 되었다!!
덕분에 내가 이해할 수 있는 함수와 지식 내에서도 충분히 풀 수 있었던 문제였지만 내 함수 활용도와 코드 작문성이 떨어진다는 것도 많이 느낄 수 있었다.. 알고리즘 전문 지식은 아직도 듣기만 해도 고루하고 질리지만.. 함수나 시간복잡도, 배열이나 퀵의 중요성은 많이 느낄 수 있었다. 내가 문제를 풀기 위해서 최소한으로는 알고 있어야 하는 지식들은 나를 위해서라도 공부하는 것이 좋겠다는 것을 다시 느낄 수 있었다!