티스토리 뷰
SQL 코드카타
Q87. 577. Employee Bonus
1. 문제 링크: https://leetcode.com/problems/employee-bonus/description/
2. 정답 코드:
SELECT
e.name,
b.bonus
FROM Employee as e
LEFT JOIN Bonus as b
ON e.empId = b.empId
WHERE b.bonus < 1000 or b.bonus IS NULL
ORDER BY e.name;

Q88. 1280. Students and Examinations ★어려움★
1. 문제 링크: https://leetcode.com/problems/students-and-examinations/description/
2. 정답 코드:
SELECT
s.student_id,
s.student_name,
sb.subject_name,
COUNT(e.subject_name) as attended_exams
FROM Students as s
CROSS JOIN Subjects as sb
LEFT JOIN Examinations as e
ON s.student_id = e.student_id AND sb.subject_name = e.subject_name
GROUP BY s.student_id, s.student_name, sb.subject_name
ORDER BY s.student_id, sb.subject_name;
3. 오류 상황: 학생마다 3개의 과목 모두를 붙여줘야 하는데 JOIN으로 해결이 안됨
4. 시도 방법: 방법을 모르겠어서 생성형 AI에게 힌트를 물어봄
5. 최종 문제 해결 방법: CROSS JOIN이라는 기능을 사용해서 Students 테이블과 Subjects 테이블을 그대로 붙인다(어제 처음 들었던 카테시안 곱 개념)
CROSS JOIN을 사용해 본 적이 없어서 많이 헤맨 문제이다.
CROSS JOIN 자체도 낯설었지만, 더 복잡했던 부분은 시험 응시 이력이 0인 학생도 결과에 포함시켜야 한다는 점이었다.
이 조건 때문에 Examinations 테이블은 반드시 LEFT JOIN으로 연결해야 했고, CROSS JOIN으로 묶은 나머지 두 테이블과 Examinations 테이블을 연결하기 위해 ON 조건을 두 개나 설정해야 했다.
또 시험 응시 횟수를 계산하기 위해 COUNT(subject_name)을 사용하려 했는데, 이때 subject_name을 Subjects 테이블의 컬럼이 아니라 Examinations 테이블의 컬럼으로 선택해야 한다는 점에서 한 번 더 막혔다. 컬럼 선택이 사소한 차이처럼 보이지만, 결과값에는 엄청난 영향을 미친다는 사실을 다시 한 번 실감했다. 확실히 중급 문제답게 여러 부분에서 어려움을 많이 겪었던 문제였다.

Q89. 570. Managers with at Least 5 Direct Reports
1. 문제 링크: http://leetcode.com/problems/managers-with-at-least-5-direct-reports/description/
2. 정답 코드:
SELECT name
FROM Employee
WHERE id in (SELECT managerId FROM Employee GROUP BY managerId HAVING count(managerId) >= 5)
ORDER BY name;

처음엔 서브쿼리를 써서 작성했는데, 동일한 결과를 JOIN을 사용해서도 할 수 있다!
# 처리속도 더 빠른 Ver.
SELECT a.name
FROM Employee as a
JOIN Employee as b
ON a.id = b.managerId
GROUP BY b.managerId
HAVING count(b.managerId) >= 5
ORDER BY a.name;
Q90. 1934. Confirmation Rate
1. 문제 링크: https://leetcode.com/problems/confirmation-rate/description/
2. 정답 코드:
SELECT
s.user_id,
ROUND(SUM(IF(c.action = 'confirmed', 1, 0))/COUNT(*), 2) as confirmation_rate
FROM Signups as s
LEFT JOIN Confirmations as c
ON s.user_id = c.user_id
GROUP BY s.user_id
ORDER BY s.user_id;
3. 오류 상황: COUNT 안에 서브쿼리를 넣으려고 했더니 문법 오류가 남
4. 시도 방법: 동일 기능의 다른 함수 사용 방법을 모르겠어서 생성형 AI에게 물어봄
5. 최종 문제 해결 방법: IF와 SUM을 사용해서 action = 'confirmed'인 컬럼 갯수만 구했고, 이 조건은 LEFT JOIN 할 때 ON 조건으로 주면 나머지 케이스는 COUNT가 되지 않기 때문에 주의해야 한다!
# AVG를 사용한 더 간단한 버전!
SELECT
s.user_id,
ROUND(AVG(IF(c.action = 'confirmed', 1, 0)), 2) as confirmation_rate
FROM Signups as s
LEFT JOIN Confirmations as c
ON s.user_id = c.user_id
GROUP BY s.user_id
ORDER BY s.user_id;

Q93. 1075. Project Employees I (Q92는 다음에)
1. 문제 링크: https://leetcode.com/problems/project-employees-i/description/
2. 정답 코드:
SELECT
p.project_id,
ROUND(AVG(e.experience_years), 2) as average_years
FROM Project p
JOIN Employee e
ON p.employee_id = e.employee_id
GROUP BY p.project_id
ORDER BY p.project_id;

Python 코드카타 (https://github.com/heeso0908/codekata.git)
Q16. x만큼 간격이 있는 n개의 숫자
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12954
2. 정답 코드:
def solution(x, n):
answer = []
for i in range(1, n+1) :
answer.append(x*i)
return answer
3. 오류 상황: 음수를 넣었을 때 원하는 결과가 나오지 않음
4. 시도 방법: range 함수로는 양수 케이스만 해결이 가능한 것 같아서 어떻게 접근해야 할지 생성형 AI에게 힌트를 물어봄
5. 최종 문제 해결 방법: x에 1부터 n까지의 숫자를 곱해줘서 리스트를 생성!
def solution(x, n):
answer = []
for i in range(x, n*x+1, x) :
answer.append(i)
return answer
# 이전에 작성한 코드
Q17. 자연수 뒤집어 배열로 만들기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12932
2. 정답 코드:
def solution(n):
answer = []
for i in str(n)[::-1] :
answer.append(int(i))
return answer
Q18. 문자열을 정수로 바꾸기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12925
2. 정답 코드:
def solution(s):
answer = int(s)
return answer
Q19. 정수 제곱근 판별
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12934
2. 정답 코드:
def solution(n):
for i in range(1, n+1) :
if n == i**2 :
answer = (i+1)**2
break
else :
answer = -1
return answer
Q20. 정수 내림차순으로 배치하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12933
2. 정답 코드:
def solution(n):
num = []
for i in str(n) :
num.append(i)
num.sort(reverse = True)
temp = ""
for j in num:
temp += j
answer = int(temp)
return answer
3. 오류 상황: 리스트에 있는 문자들을 바로 붙이는 방법을 모름
4. 시도 방법: 해결할 수 있는 함수나 방법을 모르겠어서 생성형 AI에게 물어봄
5. 최종 문제 해결 방법: 빈 문자열을 만들고 for문을 활용해서 역순으로 배열된 리스트의 요소들을 하나씩 붙이고 int 형 변환한다!
빈 문자열을 만들어야 한다는 생각을 아예 하질 못했고, 역순 정렬도 desceding=True로 생각했었는데, reverse=True 였다,,
이러한 유형도 여러번 풀어봐야 익숙해질 수 있을 것 같다.
또, 아래처럼 "" 기준(글자 사이에 공백이 없어서 "")으로 글자들을 붙이는 함수도 있다고 한다!
우선 위의 방식으로 학습한 뒤에 차차 기능들을 구현할 수 있는 함수를 익혀야 겠다.
# Q15 - ver.2
def solution(n):
num = []
for i in str(n) :
num.append(i)
num.sort(reverse = True)
temp = "".join(num)
answer = int(temp)
return answer
라이브 세션) 데이터 전처리/시각화 1일차 - [Pandas로 CSV/Excel/JSON 다루기]
판다스로 불러오고 → (정리(전처리)하고 → 간단히 확인(시각화 맛보기)하고) → CSV/Excel/JSON으로 저장해서 팀에 공유한다
.str.replace("원", "", regex=False)
str 속성
replace() 메서드
오전부터 계속 세션을 듣느라 개인 공부할 시간이 거의 없었다.
코드카타도 마지막 세션이 끝난 뒤에야 겨우 마무리했고, 목표였던 녹화 강의 완강은 주말로 미뤄야 할 것 같다.
이번 주에 배운 내용들이 파이썬에서 핵심이 되는 개념들이고 난이도도 높아서, 주말에는 복습에 꽤 많은 시간을 투자해야 할 것 같다. 그럼에도 무탈하게 4주 차를 마무리할 수 있어 다행이라는 생각이 든다.
다음 주 금요일부터는 기초 프로젝트가 시작되니, 주말 동안 복습은 물론 컨디션 관리에도 신경 써서 다음 주에는 집중력을 잃지 않도록 준비해야겠다!
'내일배움캠프 데이터 분석' 카테고리의 다른 글
| 19일차) 내일배움캠프 데이터 분석 TIL - 파이썬 전처리/시각화(2) (2) | 2026.01.19 |
|---|---|
| 260118) 주말 SQL/파이썬 코드카타 (2) | 2026.01.18 |
| 17일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(9) (0) | 2026.01.15 |
| 16일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(8) (0) | 2026.01.14 |
| 15일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(7) (0) | 2026.01.13 |
- Total
- Today
- Yesterday
- 데이터시각화
- 데이터분석입문
- git
- 태블로
- 통계
- 중학생코딩
- 코드카타
- Til
- 비전공자코딩
- GoogleColab
- 코딩기초
- 내일배움캠프
- 텍스트분석
- 머신러닝
- 데이터분석
- 코딩처음
- 판다스
- Tableau
- 프로그래밍입문
- Python
- 구글코랩
- 파이썬
- SQL
- github
- 파이썬입문
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
