240604_TIL

J Lee·2024년 6월 4일
0

아무리 사소하더라도 배움이 없는 날은 없다.

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 나눠서 조건문으로 처리하느라 머리 싸맬 필요가 없었는데 시간을 너무 많이 쓴 듯.

profile
기본기를 소홀히 하지 말자

0개의 댓글