해시

happiyoung_·2026년 4월 21일

codingtest

목록 보기
1/6

핵심

개수 세기 유형

  1. 리스트로 하면 탐색 시간 소모가 크다. (list.remove() / for … in range(0, len(list)))
  2. 딕셔너리를 활용해서 key 기준 계수하는 테이블 생성 하기 (d[name] = d.get(name, 0) + 1 )
  3. 이후 value 값을 이용해서 수를 더하고 빼면서 로직 구현

존재 여부 유형

  1. 리스트 관련 함수 적용
    1. 정렬, 제거, 나열, 필터링, 등

1. 완주하지 못한 선수

def solution(participant, completion):
    d = {}
    # 참가자 수 세기
    for name in participant:
        d[name] = d.get(name, 0) + 1 # key가 없다고 하더라도 에러없이 default r값으로 dict 생성
        # name:숫자
    
    # 완주자 수 빼기
    for name in completion:
        d[name] -= 1
        # 참가를 했다면 기본적으로 1, 완주하면 -1 되어 0이 됨
    # 남은 사람 찾기
    for name in d:
        if d[name] > 0: # 완주했다면 0이 되었을테니, 0이상인 값의 key returb
            return name

2. 폰켓몬

def solution(nums):
    # '종류:마리수' 느낌으로 dict 생성
    mon_nums = len(nums)
    d = {}
    # 해시테이블 생성
    for mon in nums:
        d[mon] = d.get(mon,0)+1 # 개체 유형별로 몇마리인지 정리
    # 전체 유형 수
    mon_type = len(set(nums))
    # 전체 유형수가 절반보다 많으면 절반이 유형의 최대값
    #                     적으면 그때의 유형의 개수가 최대값
    if mon_type < (mon_nums / 2):
        return mon_type
    else: 
        return mon_nums / 2

3. 전화번호 목록

def solution(phone_book):
    # 리스트를 정렬하면 접두어 바로 뒤에 해당되는 접두어를 가진 요소가 붙게됨 => 핵심!
    phone_book.sort()
    
    for i in range(len(phone_book) - 1):
	    # 접두어로 시작하는지 확인하기 위한 메서드
        if phone_book[i+1].startswith(phone_book[i]):
            return False
    return True

4. 의상

def solution(clothes):
    closet = {}
    for _, category in clothes:
        # 어떤 옷인지는 이 문제에서 중요하지 않음 => 카운팅만 해주면 된다.
        closet[category] = closet.get(category, 0) + 1
       
    # 딕셔너리 key 값별로 value의 길이를 구하고 각각 +1 해주고, 최종 값에서 아무것도 안입는 경우 1을 빼주면 결과값
    answer = 1
    for k, v in closet.items(): # 딕셔너리 요소별로 키와 값 가져오기
        v = v + 1
        answer *= v

    answer -= 1
        
    return answer

0개의 댓글