티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/42578#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제설명
코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.
예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.
종류 이름
- 코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다.
- 착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.
- 코니는 하루에 최소 한 개의 의상은 입습니다.
코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
- 코니가 가진 의상의 수는 1개 이상 30개 이하입니다.
- 같은 이름을 가진 의상은 존재하지 않습니다.
- clothes의 모든 원소는 문자열로 이루어져 있습니다.
- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자 또는 '_' 로만 이루어져 있습니다.
입출력 예
접근 방법
1. clothes 리스트를 Dic 자료형을 이용하여, 의상별로 카운팅한다.
2.1 이때 의상이 한 종류일경우 Dic의 len을 리턴
2.2 만약 의상이 여러종류의 경우 해당 의상 count에 1을 더해 곱해준다.
그 이후 -1 해준다(하나도 착용하지 않은 경우의 수)
처음짠 정답 소스코드
def solution(clothes):
answer = 0
clothesDic = {}
for clothe in clothes:
if clothe[1] in clothesDic:
clothesDic[clothe[1]] += 1
else:
clothesDic[clothe[1]] = 1
if len(clothesDic.keys()) == 1:
answer = len(clothes)
else:
total = 1
for i in clothesDic.values():
total *= (i+1)
answer = total -1
return answer
리펙터링 소스코드
from collections import defaultdict
def solution(clothes):
answer = 1
clothesDic = defaultdict(int)
for clothe in clothes:
clothesDic[clothe[1]] += 1
for i in clothesDic.values():
answer *= (i+1)
answer -= 1
return answer
알게된 것
Collections의 defaultDict Object를 사용하면 손쉽게 카운팅 할 수 있는것을 알게 되었다.
일반 Dict의 경우 비어있는 없는 값을 참조할 경우 KeyError를 호출하게 된다.
따라서
for clothe in clothes:
if clothe[1] in clothesDic:
clothesDic[clothe[1]] += 1
else:
clothesDic[clothe[1]] = 1
if문을 통해 의상이 Dict에 있는지 확인 후 1을 더해주었다.
하지만 Collections의 defaultDict를 사용하면 keyError를 뱉어내지 않는다.
When a letter is first encountered, it is missing from the mapping, so the default_factory function calls int() to supply a default count of zero. The increment operation then builds up the count for each letter.
The function int() which always returns zero is just a special case of constant functions. A faster and more flexible way to create constant functions is to use a lambda function which can supply any constant value (not just zero):
문자가 맨처음 발견되면 default_factory를 통해서 default 값인 0으로 초기화 해준다.
'CS > 코딩테스트' 카테고리의 다른 글
프로그래머스 / LEVEL2 / 프로세스 / python3 (0) | 2023.11.21 |
---|---|
프로그래머스 / LEVEL2 / 괄호 회전하기 / python3 (0) | 2023.11.15 |
프로그래머스 / LVEL2 / 숫자의 표현 (0) | 2023.11.07 |
프로그래머스 - 다음 큰 숫자 - python3 (0) | 2023.11.06 |
프로그래머스 - LEVEL2 - JadenCase 문자열 만들기 (0) | 2023.11.03 |
- Total
- Today
- Yesterday
- spring
- vue정의
- builder
- Mac
- collections
- python3
- LELVE1
- vue3
- defaultdict
- python2.7
- 문제 리포트
- Leve2
- composition api
- Java
- Level2
- 숫자의표현
- 주사위게임3
- 클래스초기화블럭
- level1
- vue3란?
- JAVA 변수 초기화
- 다음 큰 숫자
- 프로그래머스
- JadenCase
- 괄호 회전하기
- 인스턴스초기화블럭
- 명시적 초기화
- 문자열만들기
- optionsAPI
- 초기화블럭
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |