🍎 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까지로 마무리하고..
한 번 복습 좀 하다가. 스프링 보안도 좀 찾아서 혼자 만들어 봐야 겠다~~~!