띵유로그

[프로그래머스][해시][위장] 본문

알고리즘

[프로그래머스][해시][위장]

띵유 2020. 8. 4. 23:35
반응형

파이썬에 아직 익숙하지 않아 다 풀어놓고 잠시 헤메었다.

set생성시 변수명을 set으로 두니 local variable 'set' referenced before assignment 오류가 발생했다. 
( set=set() )

파이썬 콘솔(파이썬3.7.1)에서는 해당 오류가 발생하지 않는데 프로그래머스에서 실행하면 발생한다.

변수명을 다르게 설정하니 문제가 해결된것으로 보아 특정 단어를 미리 예약해둔 모양인데 확인해봐야겠다.

 

여튼,,, 내 풀이는 아래와 같다.

def solution(clothes):
    answer=1
    dict_ ={}
    c_list=set()
    for i in range(len(clothes)):
        if clothes[i][1] in dict_.keys():
            dict_[clothes[i][1]]=dict_[clothes[i][1]]+1
            c_list.add(clothes[i][1])
        else:
            c_list.add(clothes[i][1])
            dict_[clothes[i][1]]=1

    for i in c_list:
        answer=answer*(dict_[i]+1)

    answer=answer-1
    return answer

얼른 파이썬에 익숙해져서 짧고 간결한 코드를 짜보고싶다..ㅎㅎ


내가 푼 방법의 핵심은 조합이다.

의상 종류별로 개수를 구한 후 모두 곱하면 선택할 수 있는 가지수가 나온다.
이때 어떤 의상는 선택하지 않을 수도 있으므로 '선택하지 않는다'는 선택지가 늘어난다.

예를들어 상의가 총 2개라면 상의를 선택하지 않을 가지수를 포함해야한다. 즉 상의의 가지수는 3이 된다.
이렇게 종류별로 +1씩하여 곱한 후 -1을 해준다.(모두 선택하지 않을 때는 제외)

 

 


다른사람 풀이)
1. counter 에 대해서 새로 알았다.
  리스트에서 각 원소의 개수를 직접 세지 않아도 counter 로 생성하기만 하면 바로 딕셔너리 형태로 개수가 반환된다....!!
  update 함수를 통해 기존에 세던것에서 계속 이어나갈 수도 있고 most_common값도 구할 수 있다. 신세계.
  내가 쓴 첫번째 for문은 아래 코드로 간단하게 표현가능하다.
    Counter([kind for name, kind in clothes])

 

2. reduce로 연속적인 계산 가능
https://www.daleseo.com/python-functools-reduce/
 

반응형
Comments