SQL 코드카타 172번
그렇게까지 어려울 게 없는 조인 문제.
SELECT s.hacker_id,
h.name
FROM submissions s
JOIN challenges c ON s.challenge_id = c.challenge_id
JOIN difficulty d ON c.difficulty_level = d.difficulty_level
JOIN hackers h ON s.hacker_id = h.hacker_id
WHERE s.score = d.score
GROUP BY s.hacker_id, h.name
HAVING Count(*) >= 2
ORDER BY Count(*) DESC, s.hacker_id ASC;
알고리즘 코드카타 61번
알아볼 수 없는 문자 0이 섞여있는 로또를
실제 당첨 결과와 비교했을 때, 실현 가능한 최저 순위와 최고 순위를 구하는 문제.
<1트> : 테스트 케이스 통과, 제출 결과 오답(93.3)
def solution(lottos, win_nums):
lottos_max = 0 #최고 순위
lottos_min = 0 #최저 순위
x = len(set(lottos).intersection(win_nums)) #공통 원소의 수
y = lottos.count(0) #lottos의 0의 개수
if x == 0:
lottos_min = 6
lottos_max = 1
elif x == 6:
lottos_min = 1
lottos_max = 1
else:
lottos_min = 7-x
lottos_max = 7-(x+y)
result = [lottos_max, lottos_min]
return result
테스트 케이스는 통과했는데 제출한 결과 15개 중 딱 한 개의 케이스를 커버하지 못해 오답이 떴다. 어떤 케이스를 커버하지 못한 건가 싶어서 계속 고민...
2시간 정도 생각해 보니 x가 0일 때, 즉 lottos와 win_nums 간에 공통 원소가 하나도 없을 때의 lottos_max가 꼭 1이 되는 것은 아니었다! 예를 들어,
lottos = [1,2,3,4,5,6]
win_nums = [7,8,9,10,11,12] 라고 하면
두 리스트 사이에는 겹치는 요소가 없으므로 x=0이지만 최고 순위와 최저 순위가 모두 6이기 때문. 따라서 y의 갯수에 따른 조건까지 한번에 처리할 수 있게 조건문을 수정해 주어야 한다.
<2트> : 정답
def solution(lottos, win_nums):
x = len(set(lottos).intersection(win_nums)) #공통 원소의 수
y = lottos.count(0) #lottos의 0의 개수
lottos_min = 7-x if x>1 else 6
lottos_max = 7-(x+y) if (x+y)>1 else 6
return [lottos_max,lottos_min]
이렇게 간단하게 조건문을 수정해 주니
마지막 하나 남았던 오답 케이스까지 통과되면서 정답으로 떴다.
복잡하게 x랑 y 나눠서 조건문으로 처리하느라 머리 싸맬 필요가 없었는데 시간을 너무 많이 쓴 듯.