티스토리 뷰

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주 차를 마무리할 수 있어 다행이라는 생각이 든다.

다음 주 금요일부터는 기초 프로젝트가 시작되니, 주말 동안 복습은 물론 컨디션 관리에도 신경 써서 다음 주에는 집중력을 잃지 않도록 준비해야겠다!
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함