99클럽 코테 스터디 2기 첫째날
나는 파이썬/비기너로 참여했다!
이번 주제는 "해시"
사실 첫날이라 주제가 따로 있는지도 몰랐다 ㅠ.. 다음부터는 확인하고 문제를 푼다면 좀 더 공부가 잘 되겠지..!
문제
코드
#nums는 폰켓몬의 종류 번호가 담긴 1차원 배열 (1,2,3,4..?가 아니라 1~200000 이하 자연수.. 입력받기)
#len(list)/2만 가져갈수 잇음. 이 중에 최대인 경우의수
def solution(nums):#최대로 고를 수 있는 포켓몬 종류 수 리턴
answer = 0
mon_max=len(nums)/2 #가질 수 있는 최대 포켓몬 수
dif_mon=len(set(nums))
if mon_max>=dif_mon:
answer=dif_mon
elif mon_max<dif_mon:
answer=mon_max
return answer
처음 문제를 받았을 때 코딩테스트 대비를 이제 시작한 나라서.. 설명이 긴 코딩 문제가 처음이라 당황했다.
일단 처음 느낀건, 문제를 이해해서 알고리즘을 짜는게 먼저겠구나! 했다
당연한 얘기지만, 무작정 코드부터 작성하지 않고 주석을 달아 내가 이해한 내용을 정리하면서 내가 코드를 짜야할 방향을 검토했다.
첫 코딩을 대학교 1학년때 c언어로 해서, 리스트에 관련된 문제가 나오면 일단 for문부터 쓰는데..! 알고리즘 자체는 간단하다고 생각했는데 for문으로 나타내기가 쉽지않았다.
알고리즘
#내가 가질 수 있는 폰켓몬이 전체 폰켓몬수의 반
#이 중에서 가져갈 수 있는 가짓수를 다양하게-> 최대의 경우의 수를 찾아야 하므로
#폰켓몬의 종류 가짓수를 구해서
--> 둘의 교집합, 그러니까 전체 폰켓몬 수의 반과 포켓몬 종류 가짓수를 비교해 작은 것이 답이된다고 생각했다.
for문을 쓰려고 여러 시도를 하다가 파이썬 함수를 검색했는데 set 함수의 존재를 알게되었고..! 파이썬은 정말.. 편리한 언어라고 생각했다..ㅎㅎ
Something new I learned
(1) set(list) : list에서 중복을 제거해준다.
(2) 처음에 당연히 입력을 받아야한다고 생각에서 입력 nums=list(map(int,input().split()) 부터 썼는데 계속 오류가 나서 찾아보니 문제를 주신 사이트? 프로그래머스 스쿨 자체의 프로그램에서는 표준 입출력을 못받는다 는 글을 찾았다..! 혹시 모르시는 분들이 참고하면 좋을 듯해서 남긴다!
Feedback
셀프세션에서 다른 비기너 분의 코드를 보니 나랑 거의 비슷했다.
--> 이에 대한 클럽장님께서 피드백
-연산 반복 줄이기!!
-if else 직관적이여서 좋지만 작은 것을 선택해야하는 거니까-> min 메소드 쓰는게 더 간결할듯!!
피드백에 맞게 수정해 본 코드
def solution(nums):#최대로 고를 수 있는 포켓몬 종류 수 리턴 answer = 0 answer=min(len(nums)//2,len(set(nums))) return answer
아주 간결해졌다..!!!!
To do list