주노 님의 블로그

20240710 사전캠프 8일차 TIL 본문

TIL

20240710 사전캠프 8일차 TIL

juno0432 2024. 7. 10. 18:02

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

  • 14:00 ~ 14:10 : 어제 TIL 복습
  • 14:10 ~ 15:00 : 알고리즘 (28~32)
    Stirng과 StringBuilder의 차이
  • 15:00 ~ 16:00 : 데일리 과제
    5주차 화요일 : SQL 연습문제 6번
    5주차 수요일 : SQL 연습문제 7번
  • 16:00 ~ 17:30 : 강의 (엑셀보다 쉽고 빠른 SQL) : 4주차
  • 17:30 ~ 17:50 : TIL정리
  • 17:50 ~ 18:00 : 매니저님 상담

알고리즘 28~32

더보기
문제 설명
길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

 

class Solution {
    public String solution(int n) {
        String answer = "";
        for(int i = 1; i<=n; i++) {
            if (i % 2 != 0)
                answer += "수";
            else answer +="박";
        }
        return answer;
    }
}

 

아무 생각없이 위 코드로 작성했는데

시간이 엄청 불어나는것임

 

문자열은 불변객체기때문에 더할때마다 새로운 문자열 객체가 생성됨.

 

즉 주소를 1로 가리키고 있던 "수" 가 +연산으로 박이 붙여진다면

원래의 "수" 가 있던 주소는 그대로, "수박"이라는 문자열은 생성되어 2번 주소가 된다는뜻이고

answer은 1에서 2를 가리키게 된다.

 

스트링빌더 사용

class Solution {
    public String solution(int n) {
        StringBuilder result = new StringBuilder();
        String answer = "";
        for(int i = 1; i<=n; i++) {
            if (i % 2 != 0)
               result.append("수");
            else result.append("박");
        }
        answer=result.toString();
        return answer;
    }
}

 stringBuilder은 가변 문자열 객체로 문자열을 더하거나 빼도 기존 배열을 변경한다

고로 추가하든, 삭제하든 똑같은 주소를 가르키며, 새로운 객체의 생성은 없기때문에 빠르다.

 

n==10000 기준으로 두 연산을 비교했을때.

물론 1초 미만이라 모르겠지만

65배 정도 빠른것을 계산할 수 있다.


데일리 과제

더보기

21. lol_users 테이블에서 각 유저의 레이팅(rating) 순위를 계산하는 쿼리를 작성해주세요! 전체 지역(region) 기준이고 순위는 레이팅이 높을수록 높아야해요. (e.g. rating 1400 유저의 순위 > rating 1350 유저의 순위)
SELECT ROW_NUMBER() OVER (ORDER BY rating DESC) AS 순위, NAME, REGION, RATING
FROM lol_users;
SELECT rank() OVER (ORDER BY rating DESC) AS 순위, NAME, REGION, RATING
FROM lol_users;

22. lol_users 테이블에서 가장 늦게 게임을 시작한(join_date) 유저의 이름을 선택하는 쿼리를 작성해주세요
SELECT name
FROM lol_users
ORDER BY JOIN_DATE DESC
LIMIT 1

23. lol_users 테이블에서 지역별로 레이팅이 높은 순으로 유저들을 정렬해서 나열하는 쿼리를 작성해주세요!
SELECT *
FROM lol_users
ORDER BY region, RATING DESC

24. lol_users 테이블에서 지역별로 평균 레이팅을 계산하는 쿼리를 작성해주세요!
SELECT REGION 지역, AVG(rating) 평균점수
FROM lol_users
GROUP BY REGION;

25. lol_feedbacks 테이블에서 만족도 점수(satisfaction_score)에 따라 피드백을 내림차순으로 정렬하는 쿼리를 작성해주세요!
SELECT *
FROM LOL_FEEDBACKS
ORDER BY SATISFACTION_SCORE DESC

26. lol_feedbacks 테이블에서 각 유저별로 최신 피드백을 찾는 쿼리를 작성해주세요!
SELECT USER_NAME, MAX(FEEDBACK_DATE) AS 최신피드백
FROM LOL_FEEDBACKS
GROUP BY USER_NAME


27. lol_feedbacks 테이블에서 만족도 점수가 5점인 피드백의 수를 계산하는 쿼리를 작성해주세요!
SELECT COUNT(*) AS 피드백수
FROM lol_feedbacks
WHERE satisfaction_score = 5;

28. lol_feedbacks 테이블에서 가장 많은 피드백을 남긴 상위 3명의 고객을 찾는 쿼리를 작성해주세요!
SELECT USER_NAME, COUNT(USER_NAME) '피드백 수'
FROM LOL_FEEDBACKS
GROUP BY USER_NAME
order by COUNT(USER_NAME) DESC
LIMIT 3

29. lol_feedbacks 테이블에서 평균 만족도 점수가 가장 높은 날짜를 찾는 쿼리를 작성해주세요!
SELECT FEEDBACK_DATE, AVG(SATISFACTION_SCORE) 점수
FROM LOL_FEEDBACKS
GROUP BY FEEDBACK_DATE
ORDER BY 점수 DESC
LIMIT 1


강의 (엑셀보다 쉽고 빠른 SQL) - 4주차

더보기
  • 서브쿼리
    SQL쿼리 내에서 또 다른 SQL쿼리를 작성하여, 한번의 연산으로 끝나지 않을 연산을 수행함
    복잡한 조건문 같은경우를 보다 깔끔하게 작성할 수 있음.
    select column1, special_column
    from
        ( /* subquery */
        select column1, column2 special_column
        from table1
        ) a
  • IF문과 비교
    음식주문시간이 25분보다 초과한 시간을 확인하는 쿼리문
    select order_id, restaurant_name, if(over_time>=0, over_time, 0) over_time
    from 
    (
    select order_id, restaurant_name, food_preparation_time-25 over_time
    from food_orders
    ) a

    OVERTIME이 0보다 크면 OVERTIME을 아니면 0을
    (음식준비시간 - 25 를 해주는 쿼리문)

    IF문을 사용했을때
    if문으로만 썼을때
    SELECT 
        order_id, 
        restaurant_name, 
        IF(food_preparation_time - 25 >= 0, food_preparation_time - 25, 0) AS over_time
    FROM 
        food_orders;

JOIN문
필요한 데이터가 서로 다른 컬럼에 있는 경우 가져오는 방법
SELECT *
FROM A JOIN B

LEFT(RIGHT) JOIN : 왼쪽(오른쪽) 테이블의 모든 내용과, 오른쪽(왼쪽) 테이블의 일치하는 행을 반환한다.
만약, 일치하는 행이 없다면 NULL을 반환한다

INNER JOIN : 양쪽 테이블에서 일치하는 행만 반환한다, 일치하지 않는 행은 제외한다.

일치하는 행?? 
ON절 에서 공통한 컬럼을 뽑아낼때 A테이블에도 에도 같은 컬럼이 있고, B테이블에도 같은 컬럼이 있는 경우이다. 

-- LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명

-- INNER JOIN
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명매니저님께서 오셔서 전반적인 일

 

'TIL' 카테고리의 다른 글

20240712 사전캠프 10일차 TIL  (0) 2024.07.12
20240711 사전캠프 9일차 TIL  (0) 2024.07.11
20240709 사전캠프 7일차 TIL  (0) 2024.07.09
20240708 사전캠프 6일차 TIL  (0) 2024.07.08
20240705 사전캠프 5일차 TIL  (0) 2024.07.05