티스토리 뷰
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이므로 버려짐
이렇게 보니까 이해가 되는 것 같기도 하고,, 사실 조건을 안 걸어주면 모든 행이 서로서로 다 만난다라는 말이 아직도 이해가 되지는 않는데 이걸 또 물어보니까 카테시안 곱이라는 어마무시한 이야기를 해서,,
우선 입문자 기준, "조건이 없으면 어떤 행끼리 짝을 지어줄지 몰라서" 라고만 알고 가자!
최종적으로 위 문제를 이미지로 정리해보았다!


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으로 되돌려주고,
그걸 함수 밖에서 받아서 원본에 덧씌워야 원본이 바뀐다!


여기서 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주차도 끝이라니..!🫢
내일은 세션이 여러 개 있어 정신없을 것 같지만, 목표로 했던 전처리&시각화 강의는 꼭 완강할 수 있도록 시간 관리를 잘해야겠다.
'내일배움캠프 데이터 분석' 카테고리의 다른 글
| 260118) 주말 SQL/파이썬 코드카타 (2) | 2026.01.18 |
|---|---|
| 18일차) 내일배움캠프 데이터 분석 TIL - 파이썬 전처리/시각화(1) (0) | 2026.01.16 |
| 16일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(8) (0) | 2026.01.14 |
| 15일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(7) (0) | 2026.01.13 |
| 14일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(6) (1) | 2026.01.12 |
- Total
- Today
- Yesterday
- github
- 데이터분석입문
- 데이터분석
- git
- GoogleColab
- 프로그래밍입문
- 태블로
- 머신러닝
- 구글코랩
- 내일배움캠프
- 파이썬
- 비전공자코딩
- 파이썬입문
- 코딩처음
- 데이터시각화
- Python
- Til
- SQL
- 판다스
- 통계
- 텍스트분석
- 코드카타
- Tableau
- 코딩기초
- 중학생코딩
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
