SQL 코드카타 115번
난이도가 medium이었지만 비교적 간단하게 풀렸던 문제.
select u.name as results from
MovieRating mr
left join Users u on mr.user_id = u.user_id
group by 1
order by count(*) desc, u.name
limit 1
select m.title as results
from MovieRating mr
left join Movies m on mr.movie_id = m.movie_id
where date_format(created_at,'%Y-%m') = '2020-02'
group by 1
order by avg(rating) desc, m.title
limit 1
(SELECT u.name AS results
FROM movierating mr
LEFT JOIN users u
ON mr.user_id = u.user_id
GROUP BY 1
ORDER BY Count(*) DESC,
u.name
LIMIT 1)
UNION ALL
(SELECT m.title AS results
FROM movierating mr
LEFT JOIN movies m
ON mr.movie_id = m.movie_id
WHERE Date_format(created_at, '%Y-%m') = '2020-02'
GROUP BY 1
ORDER BY Avg(rating) DESC,
m.title
LIMIT 1)
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
처음에 작성한 코드.
테스트 케이스는 통과했는데 제출 결과 오답 케이스가 많았다.
def solution(n, m):
min = 0
max = 0
if n < m:
if m%n == 0:
min = n
max = m
else:
min = 1
max = n*m
if n == m:
min = n
max = n
if n > m:
if n%m == 0:
min = m
max = n
else:
min = 1
max = n*m
return [min,max]
숫자가 한 자릿수로 작을 때는 저 정도 로직이면 될 줄 알았는데, 조금만 커져도 커버하지 못하는 케이스가 있었다. 예를 들어 n = 21, m = 36이라고 하면 첫 번째 분기를 타지만 min은 1이 아니라 3이고 max도 252다. (21×36이 아니라) 다른 로직이 필요할 것 같아서 최대공약수부터 구하고 그를 활용해서 최소공배수를 구해보기로.
def solution(n, m):
div_n = []
div_m = []
for i in range(1,n+1):
if n%i == 0:
div_n.append(i)
for j in range(1,m+1):
if m%j == 0:
div_m.append(j)
nm_min = max(set(div_n) & set(div_m)) #최대공약수 정의
nm_max = nm_min * (n//nm_min) * (m//nm_min) #최소공배수 정의
answer = [nm_min, nm_max]
return answer