-
[프로그래머스 / Python] 위장 | 초코더알고리즘/프로그래머스 2020. 8. 21. 01:35
https://programmers.co.kr/learn/courses/30/lessons/42578
문제
의상의이름,의상의종류이 주어지면 가짓수를 구하는 문제.
단, 적어도 하나라도 걸쳐야함.
그리고 의상의 이름이 같은 경우는 없으므로 우리는 의상의 종류만 고려해주면된다.
접근법
의상 종류의 수를 각각 곱해주면 되는 것까지는 다들 쉽게 생각하셨을것 같습니다.
하지만 만약 모자1,상의2,하의3이라면 (모자1,상의1),(모자1,하의1) 이런식으로 한가지씩 빠졌을 경우
어떻게 고려해주어야할지 고민을 많이했습니다 ㅜ 생각보다 매우 단순해서 조금 허무했어용..
각 가지수에 + 1을 해주어서 곱하면 됩니다! 즉 (모자1,모자0),(상의1,상의2,상의0),(하의1,하의2,하의3,하의0)
이런식으로 생각해주시면 됩니다. 하지만 총 곱한수에 1을 빼주어야하는 경우는 아무것도 걸치지 않은 경우입니다.
모자0,상의0,하의0의 경우요! 다시 풀이를 깔끔하게 정리해보겠습니다.
풀이
1. 같은 종류의 의상이 몇가지 있는지 구해서 nums배열에 저장해줍니다.
(이때, 각아이템이 빠질수있는 경우까지 고려해서 1을 더 더해줍니다)
1-1. 저는 같은 종류 의상이 몇가지 있는지 구하기 위해서 while문을 써서 clothes에 있는 요소를 하나씩
빼오면서 clothes가 빌때까지 반복했습니다.
1-2. tmp리스트에 filter함수를 사용해서 젤 첫번째 요소의 의상 종류와 같은 리스트들을 담아줍니다.
#filter함수를 통해서 lambda조건에 해당하는 리스트만을 뽑아올수 있다는점!! tmp=list(filter(lambda x:x[1]==kwd,clothes))
1-3. nums리스트에 (tmp의길이+1)을 저장해주고, clothes에 해당 의상종류를 모두 지웁니다.
2. nums 배열에 있는 수들을 다 곱해주고, -1한 값을 리턴합니다.
* 느낀점 : filter함수를 처음 사용해볼수있었고, 하나씩 빠지는 경우를 고려하기위해 각가지수를 1씩더해서
곱해주는 아이디어를 얻을 수 있었습니다.
전체코드
def solution(clothes): nums=[] #각가지수의 경우(종류의 갯수만큼 곱해줌) #모자가2개 상의가 3개면 2x3=6가지 while clothes: kwd=clothes[0][1] tmp=list(filter(lambda x:x[1]==kwd,clothes)) nums.append(len(tmp)+1) #각 아이템이 빠질수있는 경우까지 하나더더해준다. for i in tmp: clothes.remove(i) #(각 가지수+1)한 값들이 담긴 nums안에 수들을 곱해준다 ans=1 for i in nums: ans*=i #아이템을 아무것도 착용하지 않은 1가지경우 빼주기 return ans-1 print(solution([['a','face'],['b','face'],['d','상의'],['f','상의'],['w','상의'],['c','안경']])) #print(solution([['yellow_hat', 'headgear'], ['blue_sunglasses', 'eyewear'], ['green_turban', 'headgear']]))
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Python] 더 맵게 | 초코더 (0) 2020.08.29 [프로그래머스 / Python] 다리를 지나는 트럭 | 초코더 (0) 2020.08.21 [프로그래머스 / Python] 전화번호 목록 | 초코더 (0) 2020.08.19 [프로그래머스 / Python] 기능개발 | 초코더 (0) 2020.08.18 [프로그래머스 / Python] 주식가격 | 초코더 (0) 2020.08.18