KATA는 기술과 기술 향상에 초점을 맞춘 코드 챌린지입니다.
일부는 프로그래밍 기본 사항을 교육하는 반면 다른 일부는 복잡한 문제 해결에 중점을 둡니다.
이 용어는 The Pragmatic Programmer 라는 책의 공동 저자인 Dave Thomas 가
무술에서 일본의 카타 개념을 인정하면서 처음 만들어졌습니다.
Dave의 개념 버전은 코드 카타를 프로그래머가
연습과 반복을 통해 기술을 연마하는 데 도움이 되는 프로그래밍 연습으로 정의합니다.
프로그래머스에서 SQL 문제 풀기
문제
- 개발자들의 스킬에 따라 등급(GRADE)을 나누는 쿼리 작성
- A: Front End 스킬과 Python 스킬을 함께 가진 개발자
- B: C# 스킬을 가진 개발자
- C: 그 외의 Front End 개발자
- 각 개발자의 GRADE, ID, EMAIL을 조회하고,
GRADE와 ID를 기준으로 오름차순 정렬
✔️ 제출 쿼리
✔️ 쿼리 분석
# Front End 스킬 코드들을 모두 합산하여 하나의 값으로 반환
WITH fe AS (
SELECT SUM(CODE) AS CODE
FROM SKILLCODES
WHERE CATEGORY = 'Front End'
),
# Python 스킬 코드 값을 반환
py AS (
SELECT CODE
FROM SKILLCODES
WHERE NAME = 'Python'
),
# C# 스킬 코드 값을 반환
cs AS (
SELECT CODE
FROM SKILLCODES
WHERE NAME = 'C#'
)
SELECT
# 각 개발자의 스킬 코드를 검사하여 GRADE를 결정
# Front End 스킬과 Python 스킬을 모두 가지고 있으면 'A'
CASE WHEN (d.SKILL_CODE & fe.CODE) > 0 AND (d.SKILL_CODE & py.CODE) > 0 THEN 'A'
# C# 스킬을 가지고 있으면 'B'
WHEN (d.SKILL_CODE & cs.CODE) > 0 THEN 'B'
# Front End 스킬만 가지고 있으면 'C'
WHEN (d.SKILL_CODE & fe.CODE) > 0 THEN 'C'
# 그 외는 'X' (필터링에서 제외될 값)
ELSE 'X' END GRADE
, d.ID
, d.EMAIL
# DEVELOPERS 테이블에서 각 개발자의 정보를 조회
FROM DEVELOPERS d
# 각 스킬 코드 값을 CROSS JOIN으로 결합
CROSS JOIN fe
CROSS JOIN py
CROSS JOIN cs
# 'X'가 아닌 GRADE만 필터링하여 조회
HAVING GRADE != 'X'
# 결과를 GRADE와 ID를 기준으로 오름차순 정렬
ORDER BY GRADE, d.ID
&
:# Front End 스킬 코드들을 모두 합산하여 하나의 값으로 반환
WITH fe AS (
SELECT SUM(CODE) AS CODE
FROM SKILLCODES
WHERE CATEGORY = 'Front End'
),
# Python 스킬 코드 값을 반환
py AS (
SELECT CODE
FROM SKILLCODES
WHERE NAME = 'Python'
),
# C# 스킬 코드 값을 반환
cs AS (
SELECT CODE
FROM SKILLCODES
WHERE NAME = 'C#'
)
SELECT
# 각 개발자의 스킬 코드를 검사하여 GRADE를 결정
# Front End 스킬과 Python 스킬을 모두 가지고 있으면 'A'
CASE WHEN (d.SKILL_CODE & fe.CODE) > 0 AND (d.SKILL_CODE & py.CODE) > 0 THEN 'A'
# C# 스킬을 가지고 있으면 'B'
WHEN (d.SKILL_CODE & cs.CODE) > 0 THEN 'B'
# Front End 스킬만 가지고 있으면 'C'
WHEN (d.SKILL_CODE & fe.CODE) > 0 THEN 'C'
# 그 외는 'X' (필터링에서 제외될 값)
ELSE 'X' END GRADE
, d.ID
, d.EMAIL
# DEVELOPERS 테이블에서 각 개발자의 정보를 조회
FROM DEVELOPERS d
# 각 스킬 코드 값을 CROSS JOIN으로 결합
CROSS JOIN fe
CROSS JOIN py
CROSS JOIN cs
# 'X'가 아닌 GRADE만 필터링하여 조회
HAVING GRADE != 'X'
# 결과를 GRADE와 ID를 기준으로 오름차순 정렬
ORDER BY GRADE, d.ID
문제 접근 방법
필요한 스킬 코드 추출 (WITH 절)
fe CTE : Front End
스킬 코드들을 모두 합산하여 하나의 코드로 취합
py CTE : Python
스킬 코드 추출
cs CTE : C#
스킬 코드 추출
개발자 정보와 스킬 코드 매칭 :
DEVELOPERS 테이블과 스킬 코드 조인, 각 개발자의 스킬 코드 비교
CASE 문을 사용하여 각 개발자의 SKILL_CODE를 검사하여 GRADE 결정
Front End 스킬과 Python 스킬을 모두 가진 경우 GRADE는 'A'
C# 스킬을 가진 경우 GRADE는 'B'
Front End 스킬만 가진 경우 GRADE는 'C'
그 외의 경우는 'X'로 설정하여 필터링에서 제외
결과 정렬 및 필터링 :
GRADE가 'X'가 아닌 경우만 필터링
결과를 GRADE와 ID 기준으로 오름차순 정렬