[TIL 17th] exist에 대한 공부를 하다, 생각보다 어려운 친구였군
by 노실언니[문제 1] 프로그래머스 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요. [링크]
[내 풀이] 대여가능한 상태이면 0, 대여중인 상태이면 1을 리턴한 후 MAX 처리하여 해결
SELECT car_id, if(MAX(if(START_DATE<="2022-10-16" and END_DATE >="2022-10-16", 1, 0))=0,"대여 가능", "대여중")as AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY car_id
ORDER BY CAR_ID desc
새 컬럼 AVAILABILITY : if ( 대여 가능하면 0, 대여 중이면 1출력 ) 의
group by car_id MAX 가 0이면 대여 가능, 그게 아니면(1이면) 대여중 출력
풀면서도 이게 최선인가 싶음 '_'
[검색해서 찾아낸 풀이] 서브쿼리, case문, in 을 활용한 풀이
SELECT CAR_ID,
CASE
WHEN CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE) THEN '대여중'
ELSE '대여 가능'
END "AVAILABILITY"
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
대여중인 CAR_ID만 출력하는 서브쿼리 생성
전체 테이블의 각각 CAR_ID가 서브쿼리의 CAR_ID (대여중인 ID)묶음 중에 존재한다면 대여중 출력, 아니면 대여 가능 출력
어떤 식의 풀이가 더 효율적인지 튜터님께 여쭤보았다.
[어떤 풀이가 좋을까요에 대한 조언] EXIST도 고민해보기 / 성능은 EXPLAIN를 활용해볼 것
답: 대여중/대여가능을 모두 적어야하고 CAR_ID가 KEY인 table이 아니기 때문에 EXIST는 사용할 수 없다.
-> Sort: car_rental_company_rental_history.car_id DESC (actual time=0.217..0.219 rows=29 loops=1) -> Table scan on (actual time=0.19..0.194 rows=29 loops=1) -> Aggregate using temporary table (actual time=0.189..0.189 rows=29 loops=1) -> Table scan on CAR_RENTAL_COMPANY_RENTAL_HISTORY (cost=16.4 rows=162) (actual time=0.0412..0.0706 rows=160 loops=1)
-> Sort: car_rental_company_rental_history.car_id DESC (actual time=0.425..0.427 rows=29 loops=1) -> Table scan on (cost=32.7..37.2 rows=162) (actual time=0.405..0.409 rows=29 loops=1) -> Temporary table with deduplication (cost=32.6..32.6 rows=162) (actual time=0.403..0.403 rows=29 loops=1) -> Table scan on CAR_RENTAL_COMPANY_RENTAL_HISTORY (cost=16.4 rows=162) (actual time=0.0364..0.0632 rows=160 loops=1) -> Select #2 (subquery in projection; run only once) -> Filter: ((car_rental_company_rental_history.car_id = ``.CAR_ID)) (cost=18.3..18.3 rows=1) (actual time=0.00145..0.00145 rows=0.738 loops=160) -> Limit: 1 row(s) (cost=18.2..18.2 rows=1) (actual time=0.00129..0.00129 rows=0.738 loops=160) -> Index lookup on using (CAR_ID=car_rental_company_rental_history.car_id) (actual time=0.00115..0.00115 rows=0.738 loops=160) -> Materialize with deduplication (cost=18.2..18.2 rows=18) (actual time=0.121..0.121 rows=22 loops=1) -> Filter: ('2022-10-16' between car_rental_company_rental_history.start_date and car_rental_company_rental_history.end_date) (cost=16.5 rows=18) (actual time=0.0235..0.11 rows=22 loops=1) -> Table scan on CAR_RENTAL_COMPANY_RENTAL_HISTORY (cost=16.5 rows=162) (actual time=0.0172..0.045 rows=160 loops=1)
엄매 이게뭐지 '0'
[문제 2] 프로그래머스 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
[내 풀이] 범위기반 for 문의 사용
벡터의 올바른 for문 사용 [링크]
벡터 사용법 및 설명 [링크]
범위기반 for문의 사용 [링크]
숫자 > 문자 변환 [링크]
#include <string>
#include <vector>
using namespace std;
string solution(vector<string> seoul) {
int idx=0;
for(auto i : seoul){
if(i=="Kim") return ("김서방은 "+to_string(idx)+"에 있다");
idx++;
}
return "무언가 잘못됐어요";
}
[다른 사람 풀이] iterator, find 사용
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
string solution(vector<string> seoul) {
string answer = "";
int pos=find(seoul.begin(),seoul.end(),"Kim")-seoul.begin();
answer="김서방은 "+to_string(pos)+"에 있다";
return answer;
}
find(seoul.begin(), seoul.end(), "Kim") 의 의미 : seoul 벡터에서 "Kim"이 있는 위치의 iterator를 반환
- seoul.begin()의 의미 : 시작 iterator로 빼기 / 즉, iterator 간의 뺄셈으로 "Kim"의 인덱스를 구한다.
시간복잡도: O(n) (find는 선형 탐색이므로)
와, 전혀 몰랐던 함수!
'Today I Learned' 카테고리의 다른 글
[TIL 16th] MySQL 문자열 속에 무언가를 삽입/대체하는 함수 (0) | 2025.01.15 |
---|---|
[TIL 15th] 객체지향 철학에 대한 책을 샀다 (0) | 2025.01.14 |
[TIL 14th] 역시나 자바도 입력 메소드가 나를 괴롭게 하는군요 (0) | 2025.01.10 |
[TIL 13th] JAVA 2byte 정수형 char, short의 가장 큰 차이, 그리고 큰/작은 따옴표의 차이 (0) | 2025.01.09 |
[TIL 12th] SQL코드카타, Case when이 최선이 아닌 문제 (0) | 2024.12.31 |
블로그의 정보
노력하는 실버티어
노실언니