크게 어려운 점은 없었다. 다만 코드를 짤때 예외나 조건을 잘 봐줘야한다.
문제는 단순하게 경우의 수를 구해주면 된다.
옷을 돌려입는 경우의 수만 구하면 되는거 같지만 안입는 경우도 고려하여 계산 해야하기 때문에 각 옷마다 +1을 해주어 경우의 수로 곱해주면된다.
예를 들어 안경 2개, 모자 2개라면
3 x 3 = 9이므로 여기에 둘다 착용하지 않는 경우 -1을 해주면 8이 된다.
(단, 이때 옷을 입지 않는 testcase가 0인 경우도 고려해주어야 한다.)
이러한 방식을 코딩해주면 아래와 같다.
n = int(input())
for _ in range(n):
t = int(input())
if t == 0:
print(0)
continue
dic = {}
for _ in range(t):
name,kinds = input().split()
if kinds in dic:# 존재하며
dic[kinds] += 1
else:
dic[kinds] = 1
print(dic)
num = list(dic.values())
print(num)
if len(num) == 1:
num[0]+=1
else:
for i in range(len(num)-1):
if i == 0:
num[i+1] = (num[i]+1) * (num[i+1]+1)
else:
num[i+1] = num[i] * (num[i+1]+1)
print(num[-1]-1)
코드를 보면 상당히 코드가 길고 지저분하다.
고수들의 코드를 슬쩍 보니 Counter를 사용하는 경우도 존재했다.
1. 각 옷의 종류만 리스트에 담는다.
2. 담은 리스트를 Counter로 선언해준다.
3. 리스트를 차례로 1씩 더하며 곱해준다.
이렇게 로직을 짜면 내가 짠 코드의 약 1/3으로 줄어든다......ㄷㄷ 역시 능력자들
Counter쓸 생각 하지도 못하고 딕셔너리로 짰는데
다음에는 중복되는 값을 다루어야 할때 Counter 모듈을 사용해보자!
'알고리즘' 카테고리의 다른 글
백준 10828 풀이 (스택, sys.stdin.readline, 입력속도 높이기) (0) | 2021.03.04 |
---|---|
백준 2004 풀이 (조합 0의 개수) (0) | 2021.03.03 |
백준 1010 풀이 (다리 놓기, 다이나믹 프로그래밍) (0) | 2021.03.02 |
백준 11051 풀이 (이항 계수 2, 다이나믹 프로그래밍) (0) | 2021.03.01 |
백준 11050 풀이 (이항 계수 1, 팩토리얼) (0) | 2021.03.01 |