세조목

TIL(Today I Learned)10일차(23.12.11) 본문

데이터 분석 공부/TIL(Today I Learned)

TIL(Today I Learned)10일차(23.12.11)

세조목 2023. 12. 11. 21:45

1. SQL

 1) 프로그래머스 62번

https://school.programmers.co.kr/learn/courses/30/lessons/151138

62번 문제의 요구사항은 아래와 같다.

#.1 대여시작일이 2022년 9월에 속하는 대여 기록

#. 2 대여 기간이 30일 이상이면 '장기 대여', 그렇지 않으면 '단기 대여'로 표시

#. 3 대여 기록 ID를 기준으로 내림차순 정렬

 

#.1 대여시작일이 2022년 9월에 속하는 대여 기록은

START_DATE LIKE '%2022-09%' 로 나타낼 수 있다.

 

#.2은 어떻게 나타낼 수 있을까?

기간을 구해야하니 DATEDIFF 함수를 쓸 수 있을 것이다.

DATEDIFF함수는 DATEDIFF(끝나는 시점, 시작 시점)으로

문제에 적용할 경우 DATEDIFF(END_DATE, START_DATE)를 입력하면된다.

 

그런데 여기서 놓치면 안 되는 것이 하나있다.

DATEDIFF 함수 뒤에 +1을 해줘야하는 것이다.

WHY?

가령 5일에 빌려서 6일에 반납할 경우 6-5 해서 1 이라는 값이 나온다.

그런데 실제 빌린 일수는 5일, 6일 이틀이기때문에 결과값에 +1을 해줘야한다.

그래서 DATEDIFF 함수 뒤에 +1 을 해줘야하는 것이다.

 

작성한 코드들을 모두 한 데 모은 완성 코드는 아래와 같다.

SELECT HISTORY_ID,
	   CAR_ID,
       DATE_FORMAT(START_DATE, '%Y-%m-%d') START_DATE,
       DATE_FORMAT(END_DATE, '%Y-%m-%d') END_DATE,
       IF(DATEDIFF(END_DATE, START_DATE)+1 >= 30, '장기 대여', '단기 대여') 'RENT_TYPE'
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '%2022-09%'
ORDER BY HISTORY_ID DESC

 

2. PYTHON

 1) 프로그래머스 8번 문제

https://school.programmers.co.kr/learn/courses/30/lessons/120829

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제의 요구사항은 위와 같다.

일단 조건이 달려 있으니 if함수를 써야할 것 같다.

그런데 조건이 네개다.

조건이 세개면 if, elif, else 를 쓰면 되는데 네개면 어떻게 해야할까?

간단하다.

elif 한 개 더 쓰면 된다.

그렇게 했을때 완성 코드는 아래와 같다.

def solution(angle):
    if(angle<90):
        answer = 1
    elif(angle == 90):
        answer = 2
    elif(90<angle<180):
        answer = 3
    else:
        answer = 4
    return answer

 

 2) 프로그래머스 9번 문제

https://school.programmers.co.kr/learn/courses/30/lessons/120831

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

짝수의 값을 모두 더해야한다.

어떻게 코드를 짤 수 있을까?

일단 문제에서 n의 범위를 알려줬는데 아래가 그 범위이다.

 

n 범위 내에서 정수 n이 뽑혔을때, n 이하의 짝수들은 반복해서 더해질 것이기때문에

for 반복문을 쓸 수 있을 것이다.

def solution(n):
	answer = 0
    for i in range(2, n+1, 2)
    	answer+=i
    return answer

완성된 코드는 위와 같은데

우리는 짝수들만을 더할 것이기 때문에 range 안에 가장 첫번째로 2를 넣어주고,

n이하의 짝수라고 했으니 범위를 지정해주기 위해 n+1을 해주고,

짝수값만을 구하기 위해 간격을 2로 지정해준다.

그 짝수 값들을 answer에 계속해서 더해주면 최종적으로는 n이하의 짝수를 모두 더한 값이 반환된다.

 

이 때 answer = answer+i로 작성해도 되지만 또다른 표현 방식인 answer+=i 로 작성하게되면 더 간결하다. 

 

 

 3) 프로그래머스 10번 문제

https://school.programmers.co.kr/learn/courses/30/lessons/120817

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제에서는 numbers의 원소의 평균값을 반환하라고 요구한다.

 

평균값은 어떻게 구할 수 있을까?

SQL에서처럼 AVG함수가 있다면 좋겠지만 안타깝게도 PYTHON에는 AVG함수가 없기때문에

일반적으로 평균값을 구하는 방식을 활용해야한다.

일반적으로 평균값을 구하는 방식이라함은

전체 값 더하기 / 전체 개수

 

문제에서 정수 배열 numbers가 매개변수로 주어지기 때문에

numbers안에 있는 모든 값들을 더해주고 그 값을 numbers안에 있는 모든 값의 개수로 나눠주면 된다.

numbers안에 있는 값들을 반복해서 더해줄 것이기때문에 이 문제 역시 for 반복문을 사용한다.

그렇게 했을때 완성된 코드는 아래와 같다.

def solution(nubmers):
	answer = 0
	for i in numbers:
    	answer+=i
    return answer / len(numbers)

 

 4) rangerange(a, b)와 randint(a, b)함수의 차이

randrange(a, b)의 경우 a부터 b-1까지가 범위이고, randinta부터 b까지가 범위이다.