주노 님의 블로그

20240712 사전캠프 10일차 TIL 본문

TIL

20240712 사전캠프 10일차 TIL

juno0432 2024. 7. 12. 18:00

사전캠프 10일차 내용 간단요약

  • 14:00 ~ 15:30 : SQL(44~47), 알고리즘(33~34)
    FLOOR절, 정렬 알고리즘 성능 - arrays.sort의 문자배열과 숫자배열의 차이점.
  • 15:30 ~ 16:30 : 웹 개발 종합반 복습
  • 16:30 ~ 17:30 : SQL 복습
  • 17:30 ~ 18:00 : TIL정리

SQL문제풀이 - FLOOR절

더보기
PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.

 

 

이런 문제가 있다.
SELECT price_group, COUNT(*) products
FROM (
SELECT CASE 
WHEN price BETWEEN 0 AND 9999 THEN 0
WHEN price BETWEEN 10000 AND 19999 THEN 10000
WHEN price BETWEEN 20000 AND 29999 THEN 20000
WHEN price BETWEEN 30000 AND 39999 THEN 30000
WHEN price BETWEEN 40000 AND 49999 THEN 40000
WHEN price BETWEEN 50000 AND 59999 THEN 50000
WHEN price BETWEEN 60000 AND 69999 THEN 60000
WHEN price BETWEEN 70000 AND 79999 THEN 70000
WHEN price BETWEEN 80000 AND 89999 THEN 80000
WHEN price BETWEEN 90000 AND 99999 THEN 90000
END AS price_group
FROM product
WHERE price BETWEEN 0 AND 99999
) a
GROUP BY price_group
ORDER BY price_group

 

 분명히 배운 내용이라면 이렇게 줄줄이써서 답을 내리는게 맞지만

쓰면서도 너무 비효율적이라 생각했음 ㅇㅇ..

SELECT 
    (FLOOR(price / 10000) * 10000) AS price_group, 
    COUNT(*) AS products
FROM 
    product
WHERE 
    price >= 0 AND price < 100000
GROUP BY 
    price_group
ORDER BY 
    price_group;

 챗지피티한테 물어보니 FLOOR이라는 함수를 알려줬다

 

  • FLOOR()
    주어진 숫자의 소수점 이하를 버리고 내림하는함수이다.
    FLOOR(NUMBER)

  • 위 쿼리를 살펴보면
    FLOOR함수를 사용하여 가격을 10000을 나눈다.
    price/10000을 하면 이렇게 만원대만 남게 된다.
    *10000을 하게되면 원래의 그룹대로 만들게 된다.

 


알고리즘 문제풀이 - 정렬 알고리즘 성능 - arrays.sort의 문자배열과 숫자배열의 차이점.

더보기

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

 

문제를 풀면서 항상 효율적으로 코드짜려고 고민하는데..

위 문제에서 쓸데없이 시간을 많이 차지했음

 

import java.util.*;
class Solution {
    public String solution(String s) {
        StringBuilder sb = new StringBuilder();
        char[] arr = s.toCharArray();
        int[] arrInt = new int[arr.length];
        
        for (int i = 0; i < arr.length; i++) {
            arrInt[i] = arr[i];
        }
        Arrays.sort(arrInt);
        
        for (int i = arrInt.length - 1; i >= 0; i--) {
            sb.append((char) arrInt[i]);
        }
        
        String answer = sb.toString();
        return answer;
    }
}

 

String을 정렬하면 비효율적이라고 기억했던것 같아서

위 같이 짜봤음

string > 문자배열 > 정수 > 정수정렬 > 재배치

 

챗지피티한테 물어봤음

똑같이 n log n이었다...

 

실제로 테스트 해보니

문자배열에서 숫자배열로 바꾸는 과정이 더 추가되었다. (ms오타임 ns임)

이론상 1ms남짓도 안되는 세문제..

 

추가로 int자료형은 4byte, char자료형은 2byte라서 숫자가 시간이 더 걸릴수 있다. 

 

class Solution {
    public String solution(String s) {
        StringBuilder sb = new StringBuilder();
        char[] arr = s.toCharArray();
        
        Arrays.sort(arr);

        for (int i = arr.length - 1; i >= 0; i--) {
            sb.append((char) arr[i]);
        }

        String answer = sb.toString();
        return answer;
    }
}

수정된 코드는 이거.

더 깔끔해졌음 ㅇㅇ...

 

arrays.sort는 dual-pivot-quicksort 를 이용한건데, 추후 시간이되면 정렬알고리즘에 대해 포스팅 해볼예정이다.

'TIL' 카테고리의 다른 글

20240716 본캠프 2일차 TIL  (0) 2024.07.16
20240715 본캠프 1일차 TIL  (0) 2024.07.15
20240711 사전캠프 9일차 TIL  (0) 2024.07.11
20240710 사전캠프 8일차 TIL  (0) 2024.07.10
20240709 사전캠프 7일차 TIL  (0) 2024.07.09