본문 바로가기
Algorithm/프로그래머스 고득점 Kit

[프로그래머스] 고득점Kit (1) - 해시 (파이썬)

by _temp 2022. 2. 20.

1. 완주하지 못한 선수 (Lv. 1)

# 완주하지 못한 선수
def solution(participant, completion):
    info = {}
    for i in participant:
        if info.get(i):
            info[i] += 1
        else:
            info[i] = 1

    for i in completion:
        info[i] -= 1

    answer = ''
    for i, num in info.items():
        if num != 0:
            answer = i
            break
    return answer

 

동명이인이 있기 때문에 {참가자 이름 : 이름 숫자} 쌍의 info선언

완주한 사람들의 숫자를 한명씩 줄인다.

남은 info에서 숫자가 0이 아는 이름이 완주를 하지 못한 사람의 이름이다.


2. 전화번호 목록 (Lv. 2)

# 전화번호 목록
def solution(phone_book):
    dictionary = dict()
    for number in phone_book:
        for i in range(1, len(number)+1):
            x = number[:i]
            if dictionary.get(x):
                if i == len(number):
                    return False
                if dictionary[x] == 2:
                    return False
            else:
                dictionary[x] = 1
                if i == len(number):
                    dictionary[x] = 2
    return True

 

각 전화번호의 앞에서부터 하나씩 늘려가면서 dictionary에 1을 추가해준다. 단, 마지막일 경우 2를 추가

ex) 119 = {'1' : 1, '11' : 1, '119' : 2}

만약, 해당 번호가 dictionary에 있고 그 숫자가 2이면, 어떠한 번호가 현재 번호의 접두어이다. (return Fasle)

만약, 해당 번호가 dictionary에 있고 마지막까지의 전체 번호라면, 현재 번호가 어떠한 번호의 접두어이다. (return True)

그 외에는 전부 접두어관계가 없다. (return True)


3. 위장 (Lv. 2)

# 위장
def solution(clothes):
    answer = 1
    items = dict()
    for _, where in clothes:
        if items.get(where):
            items[where] += 1
        else:
            items[where] = 1
    for _, num in items.items():
        answer *= (num+1)
    answer -= 1
    return answer

 

각 부위별로 위장의 개수를 items딕셔너리에 저장해준다.

ex) {'face' : 3, 'hand' : 2}

해당 위장의 개수를 각각 1을 더하고 전부 곱한다. (위장을 착용할 수도 있고 착용하지 않을 수도 있으므로)

최소 한개의 위장을 착용해야 하므로 -1 (전부 착용하지 않은 경우의 수를 빼준다.)


4. 베스트 앨범 (Lv. 3) 

# 베스트 앨범
def solution(genres, plays):

    info = [[]for _ in range(len(genres))]
    for i in range(len(plays)):
        info[i] = [genres[i], plays[i], i]
    info.sort(key=lambda x: (-x[1], x[2]))

    hash = dict()
    for genre, number, index in info:
        if hash.get(genre):
            hash[genre][0] += number
            hash[genre][1] += [index]
        else:
            hash[genre] = [number, [index]]

    result = []
    for x in hash.values():
        result.append(x)
    result.sort(reverse=True)

    answer = []
    for _, sings in result:
        answer.append(sings[0])
        if len(sings) >= 2:
            answer.append(sings[1])

    return answer

 

info리스트에 [장르, 플레이수, 노래의 고유ID]를 각각 넣어준다.

플레이수가 높은순서로, ID가 낮은 순서로 정렬

hash에 각 장르의 플레이수를 더해가며 각 장르에 속한 ID를 배열로 저장한다.

hash = { 장르 : [플레이 수, [노래의 ID들]] }

result에 hash의 value만을 빼와서 총 플레이수가 높은 순서로 정렬

result = [플레이 수, [노래의 ID들]]

노래의 ID가 2개 이상이면 앞에서 2개를 아니면 앞에서 1개를 answer에 순서대로 append

answer 출력