본문 바로가기

내일배움캠프

TIL 21~22일차

 

🍎 How's the day going?

오늘도 개인과제 8까지... 완료.. 어려운 일들이 많았다... 공부한거 링크 걸어서 다시 정리해야겠다.

아.. 코드카타 이틀치라서 너무 많다.. 코트 카타 정리만 해야겠다..

 

  

 

🍊코드카타 목록

  • 오랜 기간 보호한 동물(1)
  • 오랜 기간 보호한 동물(2)
  • 있었는데요 없었습니다
  • 상품 별 오프라인 매출 구하기
  • 카테고리 별 도서 판매량 집계하기
  • 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기
  • 인기있는 아이스크림
  • 문자열 나누기
  • 대충 만든 자판
  • 둘만의 암호 
  • 체육복
  • 숫자 짝꿍

 

 

💡오늘 정리 목록

  • SQL 조인
  • 스프링 JPA

 

🚩오늘의 회고

 

코드카타

 

오랜 기간 보호한 동물(1)

SELECT NAME, DATETIME
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN
(
    SELECT ANIMAL_ID
    FROM ANIMAL_OUTS
)
ORDER BY DATETIME
LIMIT 3

 

오랜 기간 보호한 동물(2)

SELECT o.ANIMAL_ID,o.NAME
FROM ANIMAL_INS i JOIN ANIMAL_OUTS o
ON i.ANIMAL_ID = o.ANIMAL_ID
ORDER BY o.DATETIME - i.DATETIME DESC
LIMIT 2

 

있었는데요 없었습니다

SELECT o.ANIMAL_ID,o.NAME
FROM ANIMAL_INS i JOIN ANIMAL_OUTS o
ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE i.DATETIME > o.DATETIME
ORDER BY i.DATETIME

 

상품 별 오프라인 매출 구하기

SELECT p.PRODUCT_CODE, SUM(p.PRICE*o.SALES_AMOUNT) AS SALES
FROM PRODUCT p JOIN OFFLINE_SALE o
ON p.PRODUCT_ID = o.PRODUCT_ID
GROUP BY PRODUCT_CODE
ORDER BY SALES DESC, PRODUCT_CODE

 

카테고리 별 도서 판매량 집계하기

SELECT b.CATEGORY, SUM(s.SALES) AS TOTAL_SALES
FROM BOOK b JOIN BOOK_SALES s ON b.BOOK_ID = s.BOOK_ID
WHERE YEAR(s.SALES_DATE) = 2022 
AND MONTH(s.SALES_DATE) = 1
GROUP BY CATEGORY
ORDER BY CATEGORY

 

자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

SELECT CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS  LIKE '%통풍시트%' 
OR OPTIONS LIKE'%열선시트%'
OR OPTIONS  LIKE'%가죽시트%'
GROUP BY CAR_TYPE 
ORDER BY CAR_TYPE ASC

 

인기있는 아이스크림

SELECT FLAVOR 
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC,
SHIPMENT_ID ASC

 

문자열 나누기

class Solution {
    public int solution(String s) {
        int answer = 0;
        int a=0,b=0;
        char c = s.charAt(0);
        for(int i=0;i<s.length();i++){
            if(a==b){

                answer++;
                a=0;
                b=0;
                c=s.charAt(i);
            }
            if(c==s.charAt(i)){
                a++;
            }else{
                b++;
            }
            
        }
        return answer;

    }
}

 

대충 만든 자판

import java.util.HashMap;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        HashMap<Character,Integer> hashMap = new HashMap<>();
        for(String k : keymap){
            for(int i = 0 ; i < k.length() ; i++){
                char c = k.charAt(i);
                if(hashMap.containsKey(c)){
                    hashMap.put(c,Math.min(hashMap.get(c),i+1));
                }else{
                    hashMap.put(c,i+1);
                }
            }
        }
        for(int i = 0 ; i < targets.length ; i++){
            String t = targets[i];
            int sum = 0;
            for(int j = 0 ; j < t.length() ; j++){
                char c = t.charAt(j);
                if(hashMap.containsKey(c)){
                    sum += hashMap.get(c);
                }else{
                    sum = -1;
                    break;
                }
            }
            answer[i] = sum;
        }
        return answer;
    }
}

 

둘만의 암호

class Solution {
    public String solution(String s, String skip, int index) {
        StringBuilder sb = new StringBuilder();
        for(char c : s.toCharArray()){
            char temp = c;
            int idx=0;
            while(idx<index){
                temp = temp == 'z' ? 'a' : (char)(temp+1);
                if(skip.indexOf(temp) == -1){
                    idx++;
                }
            }
            sb.append(temp);
        }
        return sb.toString(); 
    }
}

 

체육복

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
    int[] students = new int[n];
    int answer = n;

    // Initialize students with gym clothes
    for (int i = 0; i < n; i++) {
        students[i] = 1;
    }

    // Update students based on lost and reserve arrays
    for (int l : lost) {
        students[l - 1]--;
    }

    for (int r : reserve) {
        students[r - 1]++;
    }

    // Borrow gym clothes from adjacent students
    for (int i = 0; i < n; i++) {
        if (students[i] == 0) {
            if (i > 0 && students[i - 1] == 2) {
                students[i]++;
                students[i - 1]--;
            } else if (i < n - 1 && students[i + 1] == 2) {
                students[i]++;
                students[i + 1]--;
            }
        }
    }

    // Count the number of students who can participate
    for (int s : students) {
        if (s == 0) {
            answer--;
        }
    }

    return answer;
}
}

 

숫자 짝꿍

import java.util.*;

class Solution {
    public String solution(String X, String Y) {


        Map<Character, Integer> countX = new HashMap<>();
        Map<Character, Integer> countY = new HashMap<>();

        for (char c : X.toCharArray()) {
            countX.put(c, countX.getOrDefault(c, 0) + 1);
        }

        for (char c : Y.toCharArray()) {
            countY.put(c, countY.getOrDefault(c, 0) + 1);
        }

        StringBuilder pair = new StringBuilder();
        String arr = "9876543210";
        for (char c : arr.toCharArray()) {
            if (countY.containsKey(c) && countX.containsKey(c)) {
                int minCount = Math.min(countX.get(c), countY.get(c));
                while (minCount > 0) {
                    pair.append(c);
                    minCount--;
                }
            }
        }
        String result = pair.toString();

        if (result.isEmpty()) {
            return "-1";
        }
        if (result.replaceAll("0", "").isEmpty()) {
            return "0";
        }

        return result;


    }
}

 

 

오늘의 정리 목록

1) SQL 조인

INNER JOIN: 두 테이블 간에 일치하는 행만 반환합니다.

SELECT column1, column2
FROM table1
INNER JOIN table2 ON table1.columnX = table2.columnY;

 

LEFT JOIN (또는 LEFT OUTER JOIN): 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 반환합니다.

SELECT column1, column2
FROM table1
LEFT JOIN table2 ON table1.columnX = table2.columnY;

 

RIGHT JOIN (또는 RIGHT OUTER JOIN): 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 행을 반환합니다.

SELECT column1, column2
FROM table1
RIGHT JOIN table2 ON table1.columnX = table2.columnY;

 

FULL JOIN (또는 FULL OUTER JOIN): 왼쪽 및 오른쪽 테이블의 모든 행을 반환하며 일치하는 행이 없는 경우 NULL 값을 사용합니다.

SELECT column1, column2
FROM table1
FULL JOIN table2 ON table1.columnX = table2.columnY;

 

CROSS JOIN: 모든 가능한 조합을 반환합니다. (주의: 큰 테이블에서 사용할 때 성능 문제가 발생할 수 있습니다.)

SELECT column1, column2
FROM table1
CROSS JOIN table2;

 

스프링 JPA

스프링 데이터 JPA는 JPA(Java Persistence API)를 사용하여 데이터베이스와 상호 작용하기 위한 스프링 프레임워크의 모듈입니다. 주요 기능은 다음과 같습니다:

 

1) 엔티티 매핑: JPA 애노테이션을 사용하여 Java 클래스를 데이터베이스 테이블과 매핑합니다.

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String email;
    // getters and setters
}

 

2) 리포지토리 인터페이스: 스프링 데이터 JPA는 리포지토리 인터페이스를 사용하여 CRUD(Create, Read, Update, Delete) 작업을 정의합니다.

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByUsername(String username);
}

 

3) 쿼리 메서드: 메서드 이름을 기반으로 자동으로 쿼리를 생성합니다.

List<User> findByUsername(String username);

 

4) JPQL (Java Persistence Query Language): 객체 지향 쿼리 언어로 엔티티를 대상으로 쿼리를 작성합니다.

@Query("SELECT u FROM User u WHERE u.username = :username")
List<User> findByUsernameJPQL(@Param("username") String username);

 

5) 쿼리 메서드와 @Query 조합: 쿼리 메서드와 JPQL을 조합하여 복잡한 쿼리를 작성합니다.

@Query("SELECT u FROM User u WHERE u.username = :username")
List<User> findByUsernameOrEmail(@Param("username") String username, @Param("email") String email);

 

 

스프링 데이터 JPA를 사용하면 반복적인 CRUD 작업을 줄이고 간결한 코드로 데이터베이스와 상호 작용할 수 있습니다.

 

 

오늘의 회고
아 스프링은 내부적으로 움직인는게 많아서 구조적으로 파악하는 것이 좀 어렵네..

약간 보안 쪽으로 공부하면 잘 할 수 있다던데 한번 시간 내서 스프링 과제 일단 8까지로 마무리하고..
한 번 복습 좀 하다가. 스프링 보안도 좀 찾아서 혼자 만들어 봐야 겠다~~~!

'내일배움캠프' 카테고리의 다른 글

TIL 24~24일차  (0) 2024.05.21
TIL23일차  (0) 2024.05.17
TIL 20일차  (2) 2024.05.13
TIL 19일차  (0) 2024.05.10
TIL 18일차  (0) 2024.05.09