본문 바로가기

내일배움캠프

TIL 20일차

🍎 How's the day going?

강의 듣게 되니깐 정리하긴 해야하는데.. 개인 과제 빨리 하고 싶어서.. 일단 강의 다 듣는 것만 목표로 하고, 오늘은 코드카타 관련 해서만 정리하자! 강의 듣는 것은 힘들

 

  

 

🍊코드카타 목록

  • 카테고리 별 상품 개수 구하기
  • 고양이와 개는 몇 마리 있을까
  • 입양 시각 구하기(1)
  • 진료 과목 총 예약 횟수 출력하기
  • 12세 이하인 여자 환자 목록 출력하기
  • 기사단원의 무기
  • 로또의 최고 순위와 최저 순위
  • 옹알이(2)

 

 

💡오늘 정리 목록

  • SQL 문자열 함수 정리
  • SQL 날짜/ 시간 함수 정리
  • SQL CASE WHEN 정리

 

🚩오늘의 회고

 

 

코드카타

 

1) 카테고리 별 상품 개수 구하기

- 문자열 함수 left 사용, count 함수 사용 체크

-- 코드를 입력하세요
SELECT left(PRODUCT_CODE, 2) AS CATEGORY, COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY 
ORDER BY CATEGORY

 

2) 고양이와 개는 몇 마리 있을까

- count 함수, 그룹화

-- 코드를 입력하세요
SELECT ANIMAL_TYPE , COUNT(*) AS count
FROM ANIMAl_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

 

3) 입양 시각 구하기(1)

- 시간 관련 함수 HOUR, 그룹화

-- 코드를 입력하세요
SELECT HOUR(DATETIME)  AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS 
GROUP BY HOUR HAVING HOUR >= 9 AND HOUR <20
ORDER BY HOUR ASC

 

4) 진료 과목 총 예약 횟수 출력하기

- where 함수, count, 그룹화

-- 코드를 입력하세요
SELECT MCDP_CD as 진료과코드, COUNT(*) AS 5월예약건수
FROM APPOINTMENT
WHERE MONTH(APNT_YMD) = 5
GROUP BY MCDP_CD
ORDER BY 5월예약건수, 진료과코드

 

5) 12세 이하인 여자 환자 목록 출력하기

- CASE WHEN 문제랑 밑 정렬 WHERE 문

-- 코드를 입력하세요
SELECT PT_NAME, PT_NO, GEND_CD, AGE,
CASE WHEN TLNO IS NULL THEN 'NONE'
ELSE TLNO END AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC

 

6) 기사단원의 무기

- 약수를 구하는 함수 였는데, 시간 초과 관려 해서 신경 썻어야 하는 문제

- LIMIT 을 이용하고 SQRT 제곱근을 사용해서 시간을 줄였다.

class Solution {
    public int solution(int number, int limit, int power) {
        int answer=0;
        for(int i=1;i<=number;i++){
            int cnt = count(i,limit,power);
            answer+=cnt;
        }
        return answer;
    }

    public int count(int number,int limit,int power){
        if (number==1) return 1;
        int cnt =0;
        double s= Math.sqrt(number);
        int k= (int)s;
        if(s==k){
            cnt-=1;
        }
        for(int i=1;i<=k;i++){
            if(number%i==0)  cnt+=2;
            if(cnt>limit) return power;

        }
        return cnt;
    }
}

 

-BEST 풀이 베스트 풀이가 좋아서 쓴다

- Best 풀이 방식은 미리 정해진 범위 까지 약수의 개수를 구하고 그걸 가져오는 방식을 취했다 굿굿

class Solution {

    public int solution(int number, int limit, int power) {
        int[] count = new int[number + 1];    
        for (int i = 1; i <= number; i++) {
            for (int j = 1; j <= number / i; j++) {
                count[i * j]++;
            }
        }
        int answer = 0;
        for (int i = 1; i <= number; i++) {
            if (count[i] > limit) {
                answer += power;
            } else {
                answer += count[i];
            }
        }
        return answer;
    }
}

 

7) 로또의 최고 순위와 최저 순위

- 기본 적으로 주어진 숫자가 얼마나 맞은 지 확인 후

- 0일 때 얻을 수 있는 추가 등수만 더해주면 되는 문제

- 그리고 등수에서 조건문 체크만 필요한 문제였다. 솔직히 3개 중에 젤 쉬웠다.

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
        int cnt=0;
        int cnt0=0;
        for(int i:lottos){
            if(i==0) cnt0++;
            for(int j:win_nums){
                if(i==j) cnt++;
            }
        }
        cnt0+=cnt;
        if(cnt<2) cnt=1;
        if(cnt0<2) cnt0=1;
        int[] a = new int[2];
        if(cnt0>6) cnt0=6;
        a[0]=7-cnt0;
        a[1]=7-cnt;
        return a;

    }
}

 

8) 옹알이(2)

 - 처음에는 생각보다 고민을 많이 했는데

 - 문제를 보면 주어진 단어 앞 글자가 4가지가 다 달라서 그것만 활용할 수 있으면 쉬운 문제였다.

 

import java.util.*;
class Solution {
    public int solution(String[] babbling) {
        HashMap<Character,String> words = new HashMap<>() {{
            put('a',"aya");
            put('y',"ye");
            put('w',"woo");
            put('m',"ma");
        }};
        int answer = 0;

        for(String s: babbling) {
            char prev='\u0000';
            int i=0;
            for(;i<s.length();) {
                if(prev==s.charAt(i)) break;
                String word = words.getOrDefault(s.charAt(i),"");
                if(word.equals("")) break;
                String curStr = s.substring(i,Math.min(s.length(),i+word.length()));

                if(curStr.equals(word)) {
                    prev = s.charAt(i);
                    i+= word.length();
                } else break;
            }
            if(i==s.length()) answer++;
        }
        return answer;
    }
}

 

 

오늘 정리 목록

1) SQL 문자열 함수 정리

1. LEN(): 문자열의 길이를 반환합니다.

SELECT LEN('Hello'); -- 5

 

2. LEFT(): 문자열의 왼쪽에서 지정된 수만큼의 문자를 반환합니다.

SELECT LEFT('Hello', 3); -- 'Hel'

 

3. RIGHT(): 문자열의 오른쪽에서 지정된 수만큼의 문자를 반환합니다.

SELECT RIGHT('Hello', 3); -- 'llo'

 

4. SUBSTRING() 또는 SUBSTR(): 문자열의 일부를 반환합니다.

SELECT SUBSTRING('Hello', 2, 3); -- 'ell'
-- 또는
SELECT SUBSTR('Hello', 2, 3); -- 'ell'

 

5. UPPER(): 문자열을 모두 대문자로 변환합니다.

SELECT UPPER('hello'); -- 'HELLO'

 

6. LOWER(): 문자열을 모두 소문자로 변환합니다.

SELECT LOWER('HELLO'); -- 'hello'

 

7. LTRIM(): 문자열의 왼쪽에서 공백을 제거합니다.

SELECT LTRIM('   Hello'); -- 'Hello'

 

8. RTRIM(): 문자열의 오른쪽에서 공백을 제거합니다.

SELECT RTRIM('Hello   '); -- 'Hello'

 

9. TRIM(): 문자열의 양쪽 끝에서 공백을 제거합니다.

SELECT TRIM('   Hello   '); -- 'Hello'

 

10. REPLACE(): 문자열 내의 특정 문자 또는 문자열을 다른 문자 또는 문자열로 대체합니다.

SELECT REPLACE('Hello, World!', 'World', 'Universe'); -- 'Hello, Universe!'

 

11. CONCAT(): 문자열을 연결합니다.

SELECT CONCAT('Hello', ' ', 'World'); -- 'Hello World'

 

12. CONCAT_WS(): 문자열을 지정된 구분자로 연결합니다.

SELECT CONCAT_WS(', ', 'John', 'Doe'); -- 'John, Doe'

 

 

2) SQL 날짜/ 시간 함수 정리

1. GETDATE() 또는 CURRENT_TIMESTAMP: 현재 날짜와 시간을 반환합니다.

SELECT GETDATE();
-- 또는
SELECT CURRENT_TIMESTAMP;

 

2. DATEADD(): 날짜에 일, 주, 월, 연 등을 추가합니다.

SELECT DATEADD(day, 7, '2024-05-13'); -- '2024-05-20'

 

3. DATEDIFF(): 두 날짜 간의 차이를 구합니다. 일, 주, 월 등의 단위로 결과를 반환합니다.

SELECT DATEDIFF(day, '2024-05-01', '2024-05-13'); -- 12

 

4. DATEPART(): 날짜 또는 시간에서 지정된 부분(년, 월, 일 등)을 추출합니다.

SELECT DATEPART(year, '2024-05-13'); -- 2024

 

5 . YEAR(): 날짜에서 연도를 추출합니다.

SELECT YEAR('2024-05-13'); -- 2024

 

6 . MONTH(): 날짜에서 월을 추출합니다.

SELECT MONTH('2024-05-13'); -- 5

 

7 . DAY(): 날짜에서 일을 추출합니다.

SELECT DAY('2024-05-13'); -- 13

 

8 . FORMAT(): 날짜를 지정된 형식으로 포맷팅합니다. (주의: 이 함수는 모든 DBMS에서 지원되지 않을 수 있습니다.)

SELECT FORMAT('2024-05-13', 'yyyy/MM/dd'); -- '2024/05/13'

 

9 . DATE_FORMAT(): MySQL에서 사용되는 함수로, 날짜를 지정된 형식으로 포맷팅합니다.

SELECT DATE_FORMAT('2024-05-13', '%Y-%m-%d'); -- '2024-05-13'

 

 

 

3) SQL CASE WHEN 정리

CASE WHEN 구문은 SQL에서 조건부로 값을 반환하는 데 사용됩니다. 다른 프로그래밍 언어에서의 switch 또는 if-else 문과 유사한 역할을 합니다. 간단한 형태로는 다음과 같이 사용됩니다:

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE default_result
END

 

여기서 condition1, condition2 등은 각각의 조건이며, 해당 조건이 만족될 때 result1, result2 등이 반환됩니다. ELSE 절은 모든 조건이 만족되지 않을 때 반환할 기본값을 정의합니다.

조건은 비교 연산자나 논리 연산자를 사용하여 정의할 수 있습니다.

예제 : 이름, 나이(18미만은 마이너, 18이상 65 미만은 어덜트, 나머진 시니어) 속성 명은 AGE_GROPU으로 표기

SELECT
    name,
    CASE
        WHEN age < 18 THEN 'Minor'
        WHEN age >= 18 AND age < 65 THEN 'Adult'
        ELSE 'Senior'
    END AS age_group
FROM
    person;

 

 

오늘의 회고

바쁘다.. 빨리 강의 듣고.. 개인 과제 준비해야함

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

TIL23일차  (0) 2024.05.17
TIL 21~22일차  (0) 2024.05.16
TIL 19일차  (0) 2024.05.10
TIL 18일차  (0) 2024.05.09
TIL 17일차  (0) 2024.05.08