SQL 코드카타 110번
생각을 너무 복잡하게 했다가 꼬인 문제...
여기서 시간을 많이 잡아먹었다.
문제에서 살려야 할 조건은 크게 두 개다.
① 8월 16일 이전에 가격 변경 이력이 있으면 가장 최신의 가격을 출력할 것
② 8월 16일 이전에 가격 변경 이력이 없으면 가격을 일괄적으로 10으로 출력할 것
①번부터 쿼리로 구현해 보면
SELECT product_id,
new_price AS price
FROM products
WHERE ( product_id, change_date ) IN (SELECT product_id,
Max(change_date) AS date
FROM products
WHERE change_date <= '2019-08-16'
GROUP BY 1)
8월 16일이 데이터에 있으면 그걸 기준으로 해야 하므로 <= 를 써서 8월 16일 데이터를 포함시켜 준다. (여기서 생각을 너무 복잡하게 해서, 8월 16일 데이터만 따로 빼다가 union을 해 줘야 하나 하다가 꼬임)
②번은 반대로 ①의 여집합, 즉 8월 16일 이전 데이터와 id가 겹치지 않는 것들을 조회해 주면 된다. 단, 이 때 조건에 해당하는 (product_id, price) 조합이 여러 개 있을 수 있으므로, distinct를 써서 고유 product_id만 뽑아준다.
SELECT DISTINCT product_id,
10 AS price
FROM products
WHERE product_id NOT IN (SELECT product_id
FROM products
WHERE change_date <= '2019-08-16')
이 두 개의 결과를 union하면 겹치는 영역 없이 완성된다.
SELECT DISTINCT product_id,
10 AS price
FROM products
WHERE product_id NOT IN (SELECT DISTINCT product_id
FROM products
WHERE change_date <= '2019-08-16')
UNION
SELECT product_id,
new_price AS price
FROM products
WHERE ( product_id, change_date ) IN (SELECT product_id,
Max(change_date) AS date
FROM products
WHERE change_date <= '2019-08-16'
GROUP BY product_id)
보통 내가 생각한 것만큼 깊게 생각하는 문제는 안 나온다...라고 생각하자. 간단한 풀이법을 두고 너무 멀리 돌아간 듯.
문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.
"Zbcdefg" "gfedcbZ"
대소문자 판별 + 내림차순 정렬 문제.
이걸 하나씩 뜯어서 반복문 돌리면서 정렬하고 합치고 하다 보면 너무 복잡해질 수 있다. 간단하게 풀어보면
def solution(s):
s = list(s) #①
s.sort() #②
s.reverse() #③
return ''.join(s) #④
① s를 리스트로 만든다.
② 리스트 s를 (오름차순으로) 정렬한다. (이 때, 일반적으로 대문자가 소문자보다 큰 것으로 간주되기 때문에 먼저 정렬된다.)
③ ②까지 진행된 s를 뒤집는다. (소문자 역순 + 그 다음 대문자 역순)
④ 리스트인 s를 문자열로 합쳐서 출력한다.
이 문제를 풀 때 알아야 할 것은
1. sort()로 정렬할 때는 오름차순이 기본 (대문자-소문자 순)
2. reverse()로 뒤집을 때는 완전 반대가 되기 때문에 큰 숫자인 대문자가 뒤로 감 + 대문자끼리 내림차순이 됨
코드카타 두 문제 푸는 데 시간을 너무 많이 쓴 하루.
시간이 아깝지 않으려면 정리 잘 해놔야겠다. SQLD 공부랑 전처리, 시각화 강의도 얼른 마저 들어야지.