티스토리 뷰

SQL 코드카타

Q82. 1378. Replace Employee ID With The Unique Identifier

1. 문제 링크: https://leetcode.com/problems/replace-employee-id-with-the-unique-identifier/description/

2. 정답 코드:

SELECT
    u.unique_id,
    e.name
FROM Employees as e
LEFT JOIN EmployeeUNI as u
  ON e.id = u.id
ORDER BY u.unique_id

 

Q83. 1068. Product Sales Analysis I

1. 문제 링크: https://leetcode.com/problems/product-sales-analysis-i/

2. 정답 코드:

SELECT
    p.product_name,
    s.year,
    s.price
FROM Sales as s
JOIN Product as p
  ON s.product_id = p.product_id 
ORDER BY s.product_id

 

Q84. 1581. Customer Who Visited but Did Not Make Any Transactions

1. 문제 링크: https://leetcode.com/problems/customer-who-visited-but-did-not-make-any-transactions/description/

2. 정답 코드:

SELECT
    v.customer_id,
    COUNT(*) as count_no_trans
FROM Visits as v
LEFT JOIN Transactions as t
  ON v.visit_id = t.visit_id
WHERE t.transaction_id IS NULL
group by v.customer_id
ORDER BY v.customer_id;

 

Q85. 197. Rising Temperature

1. 문제 링크: https://leetcode.com/problems/rising-temperature/description/

2. 정답 코드:

SELECT w1.id
FROM Weather as w1
JOIN Weather as w2
  ON DATEDIFF(w1.recordDate, w2.recordDate) = 1
WHERE w1.temperature > w2.temperature
ORDER BY w1.id;

3. 오류 상황: IF를 사용했더니 계속 문법 오류가 발생함

4. 시도 방법: 정확히 하루 차이가 나는 것들의 온도 비교를 해야하는데 방법을 모르겠어서 생성형 AI에게 물어봄

5. 최종 문제 해결 방법: Weather 테이블을 2번 불러와서 DATEDIFF 함수로 정확히 하루 차이나는 행을 매칭해서 붙이고, 기존 온도와 하루 전 온도를 비교한다.

 원래 주어진 데이터 자체가 하루씩 차이나서 DATEDIFF를 사용해야 한단 생각 자체를 못했고, 같은 테이블을 두번 불러올 수 있다는 걸 오늘 처음 알게 되었다. 도저히 내 머리론 처음부터 생각 못할 문제여서 지금은 이런 쿼리도 있구나하고 비슷한 문제 유형에 익숙해져야 겠다..!
# 더 간단한 버전!

SELECT w1.id
FROM Weather w1, Weather w2
WHERE DATEDIFF(w1.recordDate, w2.recordDate) = 1 AND w1.temperature > w2.temperature;

근데,, 아무리 생각해봐도 DATEDIFF(w1.recordDate, w2.recordDate) = 1 조건이 잘 이해가 되지 않았다 ㅠㅡㅠ

 

생성형 AI 설명)

 

1. Self Join 직후 (모든 경우의 수)

조건을 걸기 전에는 w1의 모든 행이 w2의 모든 행과 한 번씩 다 만난다. (매우 혼란스러운 상태)

 

2. DATEDIFF = 1 조건 적용 후 (필터링)

여기서 "왼쪽 날짜(w1)에서 오른쪽 날짜(w2)를 뺐을 때 딱 1이 남는 조합"만 생존!

w1.id (오늘) w1.Date w1.Temp 연결 w2.id (어제) w2.Date w2.Temp DATEDIFF 결과
2 01-02 25 🔗 1 01-01 10 1 (생존)
3 01-03 20 🔗 2 01-02 25 1 (생존)
4 01-04 30 🔗 3 01-03 20 1 (생존)
  • 1월 1일은 전날 데이터가 없으므로 짝을 찾지 못해 사라짐
  • 1월 4일과 1월 2일을 비교한 행은 차이가 2이므로 버려짐

 

이렇게 보니까 이해가 되는 것 같기도 하고,, 사실 조건을 안 걸어주면 모든 행이 서로서로 다 만난다라는 말이 아직도 이해가 되지는 않는데 이걸 또 물어보니까 카테시안 곱이라는 어마무시한 이야기를 해서,,

우선 입문자 기준, "조건이 없으면 어떤 행끼리 짝을 지어줄지 몰라서" 라고만 알고 가자!


최종적으로 위 문제를 이미지로 정리해보았다!

AI로 만들었더니 날자라고,,,

 

Q86. 1661. Average Time of Process per Machine

1. 문제 링크: https://leetcode.com/problems/average-time-of-process-per-machine/description/

2. 정답 코드:

SELECT
    a1.machine_id,
    ROUND(AVG(a1.timestamp - a2.timestamp), 3) as processing_time
FROM Activity as a1
JOIN Activity as a2
  ON a1.machine_id = a2.machine_id
  AND a1.process_id = a2.process_id
  AND a2.activity_type = "start"
  AND a1.activity_type = "end"
GROUP BY a1.machine_id
ORDER BY a1.machine_id;

3. 오류 상황: 어떤 케이스에서는 정답이고 어떤 케이스에서는 오답 처리됨

4. 시도 방법: 식에서 뭐가 바꿔어야 하는지 확인함

5. 최종 문제 해결 방법: SUM 값을 2로 나누는건 프로세스가 2개일 때만 적용되기 때문에 그냥 AVG 함수를 사용하면 모두 정답 처리가 된다!


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

Q11. 짝수와 홀수

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

2. 정답 코드:

def solution(num):
    if num % 2 == 0 :
        answer = "Even"
    else : answer = "Odd"
    return answer

 

Q12. 평균 구하기

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

2. 정답 코드:

def solution(arr):
    answer = sum(arr) / len(arr)
    return answer

 

Q13. 자릿수 더하기

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

2. 정답 코드:

def solution(n):
    num = str(n)
    answer = 0
    for i in num :
        answer += int(i)
    
    # [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    print('Hello Python')

    return answer

이렇게 길지만 리스트 컴프리헨션으로 하면 코드 두 줄로 끝..!

def solution(n):
    return sum(int(i) for i in str(n))

 

Q14. 약수의 합

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

2. 정답 코드:

def solution(n):
    answer = 0
    for i in range(1, n+1) :
        if n % i == 0 :
            answer += i
    return answer

 

Q15. 나머지가 1이 되는 수 찾기

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

2. 정답 코드:

def solution(n):
    num =[]
    for i in range(1, n+1) :
        if n % i == 1 :
            num += [i]    
    answer = min(num)
    return answer
% 를 사용해서 나머지가 1인 숫자를 찾고, 그 중에서 가장 작은 수를 return 하도록 함
근데 가장 작은 수는 if 문에서 나온 첫번째 i 값일테니 아래 코드와 같이 더 짧게 수정할 수 있다!
# Q15 - 수정 코드

def solution(n):
    for i in range(1, n + 1):
        if n % i == 1:
            return i  # 가장 먼저 찾은 'i'가 무조건 최소값이므로 바로 종료!

라이브 세션) Python 기초 강의 10일차 - 복습 [변수~함수]

변수에 값을 저장 = int / float / bool(True, False)

변수에 주소를 저장 = list, dictionary


함수 안에서 int / float / bool(True, False) 바꿔도 원본 int / float / bool(True, False)는 바뀌지 않는다!


Q. 만약 첫번째 케이스 같은 경우에, a 값을 바꿔주고 싶다면??

 

함수 안에서 원본 조작이 불가능한 int, float, bool 같은 친구들은 return으로 되돌려주고,
그걸 함수 밖에서 받아서 원본에 덧씌워야 원본이 바뀐다!

 

return 값에 따른 결과 참고

 


 

여기서 append는 리스트의 제일 마지막에 새로운 숫자를 넣어주는거니까 [1, 2, 3, 4]가 되는데,

append(nums) 처럼 리스트를 넣어줘버리면 [1, 2, 3, [...]] 처럼 이상한 결과 값이 나온다!

 

왜냐! 리스트는 주소값을 가지게 되는데 이 주소값이 리스트 안에 들어간다? 하면 파이썬 내부에서는 주소값을 무한반복하면서

[1, 2, 3, 300번지]

= [1, 2, 3, 1, 2, 3, 300번지]

= [1, 2, 3, 1, 2, 3, 1, 2, 3, 300번지]

...

이런 식으로 작동이 되기 때문에 편의상 [1, 2, 3, [...]] 이렇게 출력하게 된다!


Q. 만약 [1, 2, 3, [1, 2, 3]] 이렇게 출력을 하고 싶다면?

아래 코드와 같이 작성해야 한다!

nums = [1, 2, 3]
nums.append(nums[:])
print(nums)

[:] = [처음:끝]

슬라이싱

= 자른 뭉탱이를 새로운 요소로 만들어서 리턴
= 새로운 리스트의 주소값 리턴 X
= 뭉탱이는 새롭게 생긴 리스트!

오늘은 어제에 비해 집중력이 다소 떨어진 날이었다,,
그래도 오전 복습 세션을 들으면서 헷갈렸던 내용을 다시 한 번 정리할 수 있었고, 코드카타도 시간이 조금 걸리긴 했지만 하나의 테이블을 중복 조인해 원하는 값을 추출하는 유형을 익힐 수 있었다.

내일만 지나면 이번 주도 마무리인데, 시간이 정말 빠르게 느껴진다. 벌써 4주차도 끝이라니..!🫢
내일은 세션이 여러 개 있어 정신없을 것 같지만, 목표로 했던 전처리&시각화 강의는 꼭 완강할 수 있도록 시간 관리를 잘해야겠다.
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함