티스토리 뷰

SQL 코드카타

Q94. 1633. Percentage of Users Attended a Contest

1. 문제 링크: https://leetcode.com/problems/percentage-of-users-attended-a-contest/description/

2. 정답 코드:

SELECT
    r.contest_id,
    ROUND(COUNT(u.user_id)/(SELECT COUNT(*) FROM Users)*100, 2) as percentage
FROM Users as u
JOIN Register as r
  ON u.user_id = r.user_id
GROUP BY r.contest_id
ORDER BY percentage DESC, r.contest_id ASC;

3. 오류 상황: 전체 비율이 100퍼센트로 나옴

4. 시도 방법: 분모가 되는 데이터가 잘못된 것 같아 어떤 값이 들어가야 하는지 다시 체크함

5. 최종 문제 해결 방법: 두 테이블을 JOIN 하면 이미 contest_id가 있는 user_id만 남아있어서 계속 100퍼센트로 구해진 것이다! 서브쿼리를 사용하여 Users 테이블의 user_id가 분모가 될 수 있도록 변경해줘야 한다.

근데 어차피 분모에 서브쿼리를 사용해서 Users 테이블 컬럼은 계산했으니까 JOIN 필요 없이 Register 테이블만 이용해주면 더 간단하고 처리 속도가 빠른 쿼리를 작성할 수 있다!

SELECT
    contest_id,
    ROUND(COUNT(user_id)/(SELECT COUNT(*) FROM Users)*100, 2) as percentage
FROM Register
GROUP BY contest_id
ORDER BY percentage DESC, contest_id ASC;

 

Q95. 1211. Queries Quality and Percentage

1. 문제 링크: https://leetcode.com/problems/queries-quality-and-percentage/

2. 정답 코드:

SELECT
    query_name,
    ROUND(SUM(rating/position) / COUNT(result), 2) as quality,
    ROUND(SUM(IF(rating < 3, 1, 0)) / COUNT(result) * 100, 2) as poor_query_percentage
FROM Queries
GROUP BY query_name

 

Q96. 1193. Monthly Transactions I

1. 문제 링크: https://leetcode.com/problems/monthly-transactions-i/

2. 정답 코드:

SELECT
    SUBSTR(trans_date, 1, 7) as month,
    country,
    COUNT(id) as trans_count,
    SUM(IF(state = "approved", 1, 0)) as approved_count,
    SUM(amount) as trans_total_amount,
    SUM(IF(state = "approved", amount, 0)) as approved_total_amount
FROM Transactions
GROUP BY SUBSTR(trans_date, 1, 7), country;

 

Q120. 1667. Fix Names in a Table

1. 문제 링크: https://leetcode.com/problems/fix-names-in-a-table/description/

2. 정답 코드:

SELECT
    user_id,
    CONCAT(UPPER(SUBSTR(name, 1, 1)), LOWER(SUBSTR(name, 2, LENGTH(name)))) as name
FROM Users
ORDER BY user_id;

 

Q121. 1527. Patients With a Condition

1. 문제 링크: https://leetcode.com/problems/patients-with-a-condition/description/

2. 정답 코드:

SELECT *
FROM Patients
WHERE conditions like "DIAB1%"
  OR conditions like "% DIAB1%";

3. 오류 상황:  'DIAB100 MYOP'는 조회가 되는데, 'ACNE DIAB100'는 조회가 안됨

4. 시도 방법: 'DIAB1'로 단어가 시작되는 병명을 모두 찾아야 하므로, 조건을 2가지로 줌

5. 최종 문제 해결 방법: 'DIAB1%' 말고도, '% DIAB1%'도 포함해서 해결


Python 코드카타 (https://github.com/heeso0908/codekata.git)

Q21. 하샤드 수

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12947

2. 정답 코드:

def solution(x):
    num = 0
    for i in str(x) :
        num += int(i)
        if x % num == 0 :
            answer = True
        else :
            answer = False
    return answer

 

Q22. 두 정수 사이의 합

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12912

2. 정답 코드:

def solution(a, b):
    answer = 0
    if a <= b :
        for i in range(a, b+1) :
            answer += i
    else :
        for i in range(b, a+1) :
            answer += i
    return answer

 

Q23. 콜라츠 추측

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12943

2. 정답 코드:

def solution(num):
    answer = 0
    while num != 1 :
        if num % 2 == 0 :
            num = num // 2
        else :
            num = num * 3 + 1
        answer += 1
        
        if answer >= 500 :
            return -1
    return answer

3. 오류 상황:  answer가 500 이상이면 -1을 반환해야 하는데 다른 숫자를 반환함

4. 시도 방법: 뭐가 잘못된건지 알 수 없어서 생성형 AI에게 질문함

5. 최종 문제 해결 방법: 마지막 if 문에서 answer >= 500 조건을 만족하면 answer = -1 이게 아니라 바로 return -1을 해서 끝내야 함!

 

Q24. 서울에서 김서방 찾기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12919

2. 정답 코드:

def solution(seoul):
    answer = seoul.index("Kim")
    return f'김서방은 {answer}에 있다'
seoul.index("Kim")으로 인덱스 번호를 바로 찾으면 되는데, print 함수가 return 값으로 들어갈 수 없어서 return 문에는 문장 그대로를 작성해줘야 한다!

 

Q25. 나누어 떨어지는 숫자 배열

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12910

2. 정답 코드:

def solution(arr, divisor):
    answer = []
    for i in arr :
        if i % divisor == 0 :
            answer.append(i)

    if len(answer) == 0 :
        answer.append(-1)
        
    answer.sort()
    return answer

3. 오류 상황: 원하는 대로 값이 나오지 않음

4. 시도 방법: 해결할 수 있는 함수나 방법을 모르겠어서 생성형 AI에게 물어봄

5. 최종 문제 해결 방법: sort()는 리스트를 만들고 맨 마지막에 해야하고, for 문이 끝난 후에 len 확인해서 비어있으면 -1을 append 해줘야 한다!


주말에 파이썬 강의를 추가로 수강하려고 했지만, 개인 일정이 많아 듣지 못했다.
코드카타는 문제 난이도가 점점 높아지면서 해결하는 데 시간이 많이 걸려, 문제 개수를 조정해야 할지 고민이 된다.
그래도 꾸준히 풀다 보면 문제를 파악하는 속도도 점점 빨라지고, 풀이 정확도 역시 높아질 거라고 생각한다.
내일부터 또 한 주가 시작되는 만큼, 다시 힘내서 차근차근 해나가야겠다!
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함