TIL(Today I Learned)_데일리루틴_24.11.28.Thu

728x90

데일리루틴 SQL

MySQL 재구매가 일어난 상품과 회원 리스트 구하기 정답입니다.

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY USER_ID ASC, PRODUCT_ID DESC

 

  • GROUP BY USER_ID, PRODUCT_ID:
    • USER_ID와 PRODUCT_ID를 기준으로 그룹화하여 같은 회원이 같은 상품을 구매한 내역을 묶습니다.
  • HAVING COUNT(*) > 1:
    • 그룹화된 데이터 중에서 해당 회원이 동일한 상품을 두 번 이상 구매한 경우만 선택합니다.
  • ORDER BY USER_ID ASC, PRODUCT_ID DESC:
    • 결과를 회원 ID를 기준으로 오름차순 정렬하고, 회원 ID가 같은 경우 상품 ID를 기준으로 내림차순 정렬합니다.

 


데일리루틴 알고리즘

Java 명예의 전당 정답입니다.

import java.util.*;

class Solution {
    public int[] solution(int k, int[] score) {
        // 명예의 전당 점수를 저장할 우선순위 큐 (오름차순 정렬)
        PriorityQueue<Integer> hallOfFame = new PriorityQueue<>();
        // 매일 발표되는 최하위 점수를 저장할 리스트
        List<Integer> dailyMinScores = new ArrayList<>();
        
        for (int s : score) {
            // 명예의 전당에 점수 추가
            hallOfFame.offer(s);
            
            // 명예의 전당의 크기가 k를 초과하면 가장 낮은 점수를 제거
            if (hallOfFame.size() > k) {
                hallOfFame.poll();
            }
            
            // 현재 명예의 전당에서 최하위 점수를 기록
            dailyMinScores.add(hallOfFame.peek());
        }
        
        // 리스트를 배열로 변환하여 반환
        return dailyMinScores.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

  • PriorityQueue:
    • 명예의 전당 목록은 항상 상위 k개의 점수를 유지해야 하므로, 우선순위 큐를 사용해 자동으로 정렬합니다.
    • PriorityQueue는 기본적으로 오름차순 정렬되므로 최하위 점수는 peek() 메서드로 접근할 수 있습니다.
  • 반복문:
    • 매일의 점수를 명예의 전당(hallOfFame)에 추가합니다.
    • 만약 명예의 전당의 크기가 k를 초과하면 가장 낮은 점수를 제거(poll())합니다.
    • 매일 hallOfFame에서 최하위 점수(peek())를 가져와 dailyMinScores에 추가합니다.
  • 결과 반환:
    • 리스트 dailyMinScores를 배열로 변환하여 반환합니다.

 

 

728x90
반응형
LIST