[ 1차 제출 ]
def solution(clothes):
answer = 0
items = {}
for cloth in clothes:
if cloth[1] in items:
items[cloth[1]] += 1
else:
items[cloth[1]] = 1
values = list(items.values())
for i in range(len(values)):
answer += values[i]
for j in range(len(values)-i-1):
mul = values[i]
for k in range(i+1, len(values)):
mul *= values[k]
answer += mul
return answer
제시한 테스트 케이스 넘겼고 직접 가정한 테스트도 넘겼다고 생각했는데, 정확도가 처참합니다.
공개하기 부끄럽지만 쪽팔려야 발전한다는 생각에 망한 코드도 공개합니다.
더 나은 방안이 없을 지 머리 비우고 다시 백지부터 작성해보겠습니다.
/ 2차 제출 /
def solution(clothes):
answer = 0
items = {}
for cloth in clothes:
if cloth[1] in items:
items[cloth[1]] += 1
else:
items[cloth[1]] = 1
values = list(items.values())
answer = values[0] + 1
for i in range(1, len(values)):
value = values[i]+1
answer *= value
answer -= 1
return answer
싹 다 밀고 다시 풀까했는데 아무리 생각해도 딕셔너리 구현한 부분은 맞는 것 같아 그대로 두고, 값을 계산하는 부분만 바꿔봤습니다.
끙끙 예시 들며 생각해봤습니다. 결국 각 항목을 선택하냐 마느냐만 결정하면 그 항목별 값들을 곱해주면 되는 수학식이 됩니다. 그 선택 여부를 어떻게 만들까에서 시간이 걸렸는데, 아예 안 선택하는 경우 빼고는 선택 안 하는 경우 역시 계산해야하는 경우의 수 안에 포함된다고 정리를 했습니다.
다행히도 잘 맞아떨어졌습니다.
구현도 구현이지만, 수학적 논리력이 필요한 문제였습니다.
[ 다른 분들 풀이 ]
나는 저 수학식을 만든다고 여러 예시를 혼자 들어가며 이해해야 했는데 기본 개념이 없어서 이런거였나..

제 풀이와 유사한건 세 번째에야 나왔습니다.(프로그래머스 상)
사실 앞의 두 예제는 제가 애초에 할만한 접근법이 아니어서 그러려니 하지만, 제 해결법대로 해결한 사람들이 무수한 걸 보고 이 사람들은 어떻게 바로 아이디어가 떠올랐을까 비교하게 됩니다. 뭐, 하다보면 늘겠죠?
1)
def solution(clothes):
from collections import Counter
from functools import reduce
cnt = Counter([kind for name, kind in clothes])
answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
return answer
이전 문제에서 나온 Counter()클래스를 이용했네요. 한 번 봤다고 눈에 빠르게 들어옵니다.
그런데 왜 써먹지 못했을까요..? ㅎ 딱 ! 오늘 작성한 게시글에서 각 항목별 개수를 세주는 클래스라고 정리해두고 ㅎㅎ
다시 리마인드합시다.
다음 오랜만에 보는 reduce(). 이전에 R과 Hadoop을 배울 때 Map(), Reduce()를 이용해 뉴욕 택시 분석하는 빅데이터 프로젝트가 떠오릅니다.
다시 구문을 리마인드해봅시다.
reduce(적용 함수, 집계 가능 데이터, 초기값) 로 파라미터가 주어지고, 데이터를 차례대로 순회하며 적용함수를 적용시켜갑니다.
lambda구문 이용 시 reduce(lambda a, b: a이용 함수, a데이터 , b초기값) 형태로 이용 가능합니다.
내용은 같지만 구현이 더 깔끔해지는 예제.
하나하나 기능 사항이 눈에 들어오게 작성하는게 아직은 익숙하네요.
2)
import collections
from functools import reduce
def solution(c):
return reduce(lambda x,y:x*y,[a+1 for a in collections.Counter([x[1] for x in c]).values()])-1
위와 같은 내용이지만, 한 줄로 코드 자체의 내용을 확 줄인 사례도 있었습니다.
'CodingTest > Programmers' 카테고리의 다른 글
[ 프로그래머스 ] 더 맵게 (0) | 2022.06.20 |
---|---|
[ 프로그래머스 ] 프린터 (0) | 2022.06.20 |
[ 프로그래머스 ] 기능개발 (0) | 2022.06.20 |
[프로그래머스] 전화번호 목록 (0) | 2022.06.18 |
[프로그래머스] 완주하지 못한 선수 (0) | 2022.06.18 |