SQL 코드카타 111번
승객들이 turn 순서대로 버스에 탑승하는데, 정원 무게는 1,000으로 제한되어 있다. 이 때 마지막으로 탑승하게 될 사람이 누구일지 구하는 문제.
일단 누적합이 1,000에 가까운 지점이 어디일지 파악해야 하므로 window함수 중 sum over를 활용해 누적합부터 구해보기로 했다.
select turn, person_name, weight,
sum(weight) over (order by turn) as total_weight
from Queue
order by 1
실행 결과는 아래와 같다.
↑ 버스에 타는 순서가 turn으로 정해져 있으므로 turn을 기준으로 order by를 적용해야 한다.
이제 저 total_weight 컬럼을 다시 컬럼으로 활용해야 하므로 인라인 뷰 서브쿼리로 써 주면
select *
from
(select turn, person_name, weight,
sum(weight) over (order by turn) as total_weight
from Queue
order by 1) a
이렇게 되고, 여기서 total_weight가 1,000을 넘기지 않는 가장 마지막 사람을 구하려면
그러면 weight의 누적합이 1,000에 딱 걸려도 마지막 사람을 가져올 수 있고, 1,000에 못 미쳐도 어쨌든 제일 마지막에 탑승하는 사람을 가져올 수 있다. 아래는 정답 쿼리.
SELECT person_name
FROM (
SELECT turn,
person_name,
weight,
Sum(weight) over (ORDER BY turn) AS total_weight
FROM queue
ORDER BY 1) a
WHERE total_weight <= 1000
ORDER BY total_weight DESC
LIMIT 1
medium 난이도 문제에서 처음으로 30분 컷!
새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.
생각보다 쉽게 풀렸던 문제.
우선 놀이기구를 n번 탔을 때의 총 이용료, total_price를 구해준다.
def solution(price, money, count):
total_price = 0
for i in range(1,count+1):
total_price += price * i
이렇게 하면 for문이 1부터 count까지 돌면서 price와 횟수를 곱한 값을 모두 total_price에 더해준다. 예를 들어 price가 10, count가 3이라고 하면 total_price는
(10 × 1) + (10 × 2) + (10 × 3) = 60
이 되는 셈.
그리고 그 밑에 조건문을 써서 부족한 금액이 없으면 0, 있으면 그 금액만큼을 return하게 해 주면 끝.
def solution(price, money, count):
total_price = 0
for i in range(1,count+1):
total_price += price * i
if money >= total_price:
return 0
else:
return total_price-money
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
처음 작성한 코드
def solution(s):
if s.isdigit() and len(s) == (4 or 6):
return True
else:
return False
테스트 케이스는 통과했는데 제출 결과 오답이 떴다.
알고 보니 len(s)의 조건을 줄 때 저렇게 하면 안 되고 하나씩 다 명기해 줘야 했다.
정답 코드
def solution(s):
if s.isdigit() and (len(s) == 4 or len(s) == 6):
return True
else:
return False
'모두 숫자로 이루어질 것'과 '길이가 4 또는 6일 것'이 "모두 만족되어야"만 조건문 전체의 진리값이 참이므로 and로 연결해 주었다. (따라서 len의 조건끼리도 괄호를 꼭 씌워줘서 A and B로 인식되게끔 해야 함.)
오늘은 SQL문제가 생각보다 빨리 풀려서 알고리즘을 두 문제 진행했다.