나는야 포켓몬 마스터 이다솜(1620) / 패션왕 신해빈(9375)

Yeoncheol Kang·2023년 2월 21일
1
post-thumbnail

해시테이블을 이용하는 기초 문제


나는야 포켓몬 마스터 이다솜 (1620) [실버 IV]

# 입력 최적화
import sys
input = sys.stdin.readline

# 0. 입력 세팅
N, M = map(int, input().split())

# 1. 이름 - 번호 순서의 테이블, 번호 - 이름 순서의 테이블 생성
poketdex_name_id = {}
poketdex_id_name = {}
for i in range(N):
    # 입력 최적화로 오버라이딩 한 경우 개행 문자를 없애줘야함
    name = input().rstrip()
    poketdex_name_id[name] = i + 1
    poketdex_id_name[i + 1] = name

# 2. 입력 구분해서 답 출력
for i in range(M):
    question = input().rstrip()
    if question.isnumeric():
        print(poketdex_id_name[int(question)])
    else:
        print(poketdex_name_id[question])
  • 위의 코드처럼 input 함수를 오버라이딩하지 않으면 시간 초과 오류가 발생한다.
  • 해시 테이블을 번호-이름 / 이름-번호 총 2가지로 만들어 입력에 따라 다른 테이블을 사용하게끔 했다.


패션왕 신해빈(9375) [실버 III]

# 0. 입력 준비
# defaultdict로 dict 자료형을 좀 더 편하게 사용할 수 있다.
from collections import defaultdict
import math
import sys
input = sys.stdin.readline

# 테스트케이스 분기
T = int(input())
for testcase in range(T):
    # 1. 옷 카테고리별 몇 벌인지 기록한다. 어떤 옷인지는 무관하므로 개수만 기록한다.
    n = int(input())
    closet = defaultdict(int)
    # defaultdict는 0일 때를 감안하지 않아도 된다. 기존에 closet = {} 로 선언했다면,
    # 초기값은 1, 다음에 입력 받을 때는 += 1로 분기를 나누어야 했다.
    # defaultdict는 해당 키가 값을 가지지 않는다면 자동으로 0을 반환하므로,
    for _ in range(n):
        _, category = map(str, input().split())
        # 다음과 같이 += 1로 퉁칠 수 있다.
        closet[category] += 1
        
    # 2. 아주 약간의 수학이 들어간다.
    # 각각의 카테고리의 의상을 모두 고를 수 있지만 안 고르는 경우도 고려하여 각 의상 개수 + 1
    # 단, 최소 한 가지 카테고리는 입어야하므로 전체 개수에서 -1
    answer = math.prod(value + 1 for _, value in closet.items()) - 1
        
    print(answer)
  • 해시 테이블을 제작하는 데 각각이 어떤 의상인지는 몰라도 된다. 개수만 기록한 테이블을 제작한다.
  • math.prod는 리스트 내 모든 원소들을 곱해주는 메소드이다. 전체를 곱하고 -1 을 해주면 답이다.

profile
재밌는 것들을 직접 해보기를 좋아합니다

0개의 댓글