[알고리즘] 2024.09.27 풀이

2024. 9. 27. 17:15·알고리즘 메모

풀이 사이트: 프로그래머스 고득점 Kit! 

# 해시

📝 의상 (lv 2) - https://school.programmers.co.kr/learn/courses/30/lessons/42578

* 체감 난이도 : ⭐️ - - - -

- 해쉬의 매우 기본적인 문제였다.
- 옷의 종류가 정해져 있고, 중복 된 종류의 옷은 함께 입을 수 없기 때문에 구분해서 저장해야 했다.
- 그렇기 때문에 해쉬를 사용해야하며, Key는 옷의 종류로 하여 저장한다.
- 종류마다 옷들을 리스트 형태로 저장할 필요 없이 단순히 개수만 카운트하면 된다. (얼굴 : 2, 상의 : 3, 하의 : 1 ..)
- 이유는 옷의 경우의 수를 생각보면 알 수 있다.
- 단순하게 생각해봤을때 상의 3가지, 하의 2가지가 있으면 단순 조합수는 6가지이다(2x3).
- 하지만 모든 부위를 입을 필요는 없기 때문에 상의를 입지 않았을 때, 하의를 입지 않았을 때를 포함한 11가지가 답이다.
- 나는 맨살(옷을 입지 않음)을 하나의 옷 종류로 생각하여 상의 4가지, 하의 3가지로 생각했다.
- 하지만 여기서 단 하나의 예외 "하나의 옷은 입어야한다"에 해당하는 경우 1가지를 제외시켜야한다.
- 즉, 4 x 3 - 1  = 12라는 값을 구할 수 있다.
- 딕셔너리를 이용해 단순히 종류별 옷의 개수만 세고, 위의 공식을 이용해서 답을 구했다.
def solution(clothes):
    answer = 1
    
    dic = {}
    
    for i in range(len(clothes)):
        temp_key = clothes[i][1]
        
        if temp_key in dic:
            dic[temp_key] = dic[temp_key] + 1
        else:
            dic[temp_key] = 1
            
    for key in dic:
        answer *= dic[key] + 1
    
    answer -= 1
    
    return answer

 

📝 베스트 앨범 (lv 3) - https://school.programmers.co.kr/learn/courses/30/lessons/42579

* 체감 난이도 : ⭐️⭐️ - - -

- 이게 왜 lv 3인지 당최 모르겠고, 분류도 사실상 정렬 문제라고 생각한다.
- "총 재생 수를 기준으로 장르를 수록", "장르별 많이 재생된 노래 2가지를 수록 (재생수가 같을 경우 고유번호가 작은 순)"라는 2가지 기준을 위해 딕셔너리 두 가지에 장르별 총 재생수와 장르별 각 노래 정보 (고유번호, 재생 수)의 형태로 리스트에 저장했다.
- 풀이는 단순하게 총 재생수로 정렬한 후 두 번째 딕셔너리에서 우선순위가 높은 두 가지 곡의 정보를 뽑아내어 순서대로 answer에 저장하면 된다.
- 요건은 두 번째 딕셔너리에 담긴 각 장르별 노래 정보 리스트를 정렬하는 것이다.
- 나는 cmp_to_key를 지정하여 각 노래 정보 리스트를 정렬했다.
- 먼저 두 곡의 재생 수를 비교하고, 같을 경우 고유번호를 비교하여 더 작은 번호에 우선 순위를 주는 방식으로 설정했다.
- 이후 총 재생수를 기준으로 정렬된 순서에 따라 장르별 노래 2가지를 순서대로 answer에 저장하여 해결했다.
from functools import cmp_to_key

def solution(genres, plays):
    answer = []
    
    dic_count = {}
    dic_inform = {}
    
    for i in range(len(genres)):
        if genres[i] in dic_inform:
            dic_count[genres[i]] += plays[i]
            dic_inform[genres[i]].append([i, plays[i]])
        else:
            dic_count[genres[i]] = plays[i]
            dic_inform[genres[i]] = [[i, plays[i]]]
    sort_genres = sorted(dic_count.items(), key=lambda x: x[1], reverse=True)
    
    for i in range(len(sort_genres)):
        temp_genres = sort_genres[i][0]
        sorted_list = sorted(dic_inform[temp_genres], key=cmp_to_key(compare))
        for j in range(min(len(sorted_list), 2)):
            answer.append(sorted_list[j][0])
        
    return answer

def compare(x, y):
    if x[1] > y[1]:
        return -1
    elif x[1] < y[1]:
        return 1
    else:
        if x[0] < y[0]:
            return -1
        else:
            return 1

 

 

'알고리즘 메모' 카테고리의 다른 글

[백준] 그리디(일반) 코멘트 모음  (2) 2024.11.08
[알고리즘] 2024.09.29 풀이  (0) 2024.09.29
[코드트리 조별과제] 6주차 레포트  (0) 2024.08.25
[코드트리 조별과제] 5주차 레포트  (0) 2024.08.17
[코드트리 조별과제] 4주차 레포트  (0) 2024.08.11
'알고리즘 메모' 카테고리의 다른 글
  • [백준] 그리디(일반) 코멘트 모음
  • [알고리즘] 2024.09.29 풀이
  • [코드트리 조별과제] 6주차 레포트
  • [코드트리 조별과제] 5주차 레포트
csb0710
csb0710
  • csb0710
    데모장
    csb0710
  • 전체
    오늘
    어제
    • 분류 전체보기 (51)
      • 스프링부트 메모 (6)
      • 개발 메모 (3)
      • 클라우드 메모 (10)
      • 설치&설정 메모 (2)
      • 알고리즘 메모 (18)
      • 인턴 메모 (7)
      • 데이터베이스 메모 (3)
      • 책 메모 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자동 답변 봇
    코드트리
    스프링부트
    GitHub
    .gitmodules
    서버배포
    백준
    디비설정
    그리디
    submodule
    알고리즘
    코딩테스트
    서버생성
    티스토리챌린지
    코드트리조별과제
    디비설치
    이지퍼블리싱
    오블완
    ELK Stack
    서버 연결
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
csb0710
[알고리즘] 2024.09.27 풀이
상단으로

티스토리툴바