[1日3知](hash/スタック、キュー)ベストアルバム、機能開発、プリンタ

5132 ワード

ベストアルバム


最初の答え

def solution(genres, plays):
    dic = {}
    answer = []
    
    for i,genre in enumerate(genres):
        if genre in dic:
            dic[genre] = dic[genre] + plays[i] # 장르별 총 플레이 횟수 계산
        else:
            dic[genre] = plays[i]
    
    sorted_genre = sorted(list(dic.items()), 
                              reverse=True, 
                              key=lambda item: item[1])
    
    d = {}
    for elem in sorted_genre:
        if elem[0] in d:
            d[elem[0]].append(elem[1])
        else:
            d[elem[0]] = elem[1]
            
    sorted_genre = d
    # 플레이 수 기준 장르 순서 확인했음.
    # 이제 장르별, 1등, 2등 해쉬맵을 만들 것
    dic_1st_value = {}
    dic_1st_index = {}
    dic_2nd_value = {}
    dic_2nd_index = {}
    
    for i, genre in enumerate(genres):
        if genre in dic_1st_value: # 갱신 케이스
        
            # 2위도 존재하는 경우
            if genre in dic_2nd_value: 
                if plays[i] > dic_1st_value[genre]: # 신규 1위 등장
                    dic_2nd_value[genre] = dic_1st_value[genre] # 기존 1위는 2위로
                    dic_2nd_index[genre] = dic_1st_index[genre]

                    dic_1st_value[genre] = plays[i] # 1위 갱신
                    dic_1st_index[genre] = i

                elif plays[i] == dic_1st_value[genre]: # 공동 1위지만 id가 낮은 경우
                    dic_2nd_value[genre] = dic_1st_value[genre]
                    dic_2nd_index[genre] = i # 2위 갱신

                elif plays[i] > dic_2nd_value[genre]: # 신규 2위 등장
                    dic_2nd_value[genre] = plays[i] # 2위 갱신
                    dic_2nd_index[genre] = i
                    
            # 1위에는 존재하지만 2위는 없는 경우        
            elif genre not in dic_2nd_value: 
            
                # 1위와 비교 후 더 높은 경우
                if plays[i] > dic_1st_value[genre]: # 신규 1위 등장
                    dic_2nd_value[genre] = dic_1st_value[genre] # 기존 1위는 2위로
                    dic_2nd_index[genre] = dic_1st_index[genre]

                    dic_1st_value[genre] = plays[i] # 1위 갱신
                    dic_1st_index[genre] = i

                elif plays[i] == dic_1st_value[genre]: # 공동 1위지만 id가 낮은 경우
                    dic_2nd_value[genre] = dic_1st_value[genre]
                    dic_2nd_index[genre] = i # 2위 갱신

                else: # 1위보다 낮기 때문에 2위로 등극
                    dic_2nd_value[genre] = plays[i]
                    dic_2nd_index[genre] = i # 2위 갱신
                
        elif genre not in dic_1st_value: # 신규 케이스
            dic_1st_value[genre] = plays[i] # 1위 갱신
            dic_1st_index[genre] = i
            
    for genre in sorted_genre.keys():
        try:
            answer.append(dic_1st_index[genre]) # 1위
            answer.append(dic_2nd_index[genre]) # 2위
        except:
            pass # 위 try 진행하면서 1위는 기록되었음
            
    return answer
どう考えてもdictの答えを生かせなかった

機能開発

  • 残日数の数/速度を計算し、計算残日数
  • を上げる.
  • 残日数から前過程で最も長い日数(temp high)
  • を求める.
  • temp high上昇点累積(k)項目数を答えに追加し、
  • 最後に最後の項目に到達すると、これまでに蓄積した項目数が答えに追加されます.
  • import math
    
    def solution(progresses, speeds):
        
        left_pg = []
        left_days = []
        
        i = 0
        for progress, speed in (zip(progresses,speeds)):
            
            left_pg.append(100-progress)
            left_days.append(math.ceil(left_pg[i]/speed))
            i = i+1
            
        answer = []
        k = 0
        temp_high = left_days[0]
        print(left_days)
        for i, left_day in enumerate(left_days):
            if left_day > temp_high:
                answer.append(k)
                k = 1
                temp_high = left_day # update
                
                if i==len(left_days)-1:
                    answer.append(k)
                
            elif left_day <= temp_high:
                k = k+1
                
                if i==len(left_days)-1:
                    answer.append(k)
    
        return answer

    プリンタ


    印刷待ちリスト
  • から、先頭の文書(J)を取り出す.
  • 残りの
  • 個の印刷対象リストにJよりも重要なドキュメントがある場合は、Jを印刷対象リストの最後に配置します.
  • でなければJを印刷します.
  • いつもパンダのdfを想像して問題を解きます;
    def solution(priorities, location):
        
        
        count = 0
        new_prior = []
        
        for i, priority in (enumerate(priorities)):
            new_prior.append([i,priority])
        
        flag = 0
        while flag ==0:
            # print(count, new_prior)
            temp = []
            temp.append(new_prior[0]) # 인쇄 예정 목록에 추가
            new_prior.remove(temp[0]) # 대기목록에서는 삭제
            
    
            # 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하는지
            temp_high = 0
            for i in range(len(new_prior)):
                if new_prior[i][1] >= temp_high:
                    temp_high = new_prior[i][1]
                
                
                
            # 더 큰놈이 있다면
            if temp[0][1] < temp_high:
                new_prior.append(temp[0]) # 기존에 뽑아놨던 놈을 맨 뒤로 보냄
            # 더 큰놈이 없다면
            else : 
                count += 1 # 한 놈 빼내고 
                # 만약 출력 예정인 놈의 인덱스랑 로케이션의 숫자랑 일치한다면
                if temp[0][0] == location:
                    flag = 1
    
        answer = count   
    
        return answer