Data Science/SQL86 [SQL/오답] 기간별 할인 로직 구현; WITH 절과 LEFT JOIN의 조화 (프로그래머스 Lv4) 1. Problem자동차 종류가 '트럭'인 대여 기록들에 대해 각각의 최종 대여 금액(FEE)을 구해야 한다. 대여 기간에 따라 할인율이 다르게 적용되며, 7일 미만 대여 시에는 할인 정책이 존재하지 않는다. 단순히 테이블을 합치는 것을 넘어, 대여 기간을 계산하고 → 그 기간에 맞는 할인 구간을 정의하고 → 구간에 맞는 할인율을 매칭하는 3단계의 논리적 흐름이 요구되는 문제이다.2. Solution복잡한 계산 과정을 단계별로 분리하기 위해 WITH 절을 사용하여 가독성을 높이고, 데이터 유실을 막기 위해 LEFT JOIN 전략을 사용한다.DATEDIFF(...) + 1: 당일 대여/반납을 1일로 포함하는 비즈니스 관습을 정확히 반영한다.LEFT JOIN & IFNULL: 7일 미만 대여 건은 DURAT.. 2026. 2. 15. [SQL/오답] 기간 중복(Overlap)와 다중 테이블 조인을 활용한 대여 가능 차량 조회 (프로그래머스 Lv4) 1. Problem세 가지 복합 조건을 동시에 충족하는 자동차를 찾아야 한다.차종 조건: '세단' 또는 'SUV'일 것.가용성 조건: 2022년 11월 1일부터 11월 30일까지 대여 기록이 전혀 겹치지 않을 것.금액 조건: 30일간 대여 시 총비용(FEE)이 50만 원 이상 200만 원 미만일 것. 단순한 조인을 넘어 날짜의 '교집합'이 없는 집합을 추출해야 하는 고난도 문제이다.2. Solution복잡한 날짜 조건은 NOT IN 서브쿼리로 해결하고, 계산된 별칭(FEE)에 대한 필터링은 HAVING 절을 전략적으로 활용한다.기간 겹침(Overlap) 로직: 기존 종료일 >= 신규 시작일 AND 기존 시작일 3. Takeaway (예약 시스템의 핵심 논리와 성능 최적화)실제 서비스 로직을 SQL로 구현.. 2026. 2. 15. [SQL/오답] 비트 연산자의 다대다 매칭과 EXISTS 성능 최적화 (프로그래머스 Lv4) 1. Problem개발자의 스킬 정보가 2의 거듭제곱수들의 합(SKILL_CODE)으로 저장되어 있는 환경에서 'Front End' 카테고리에 속한 스킬을 하나라도 보유한 개발자를 추출해야 한다. 정수 내부에 숨겨진 비트 정보를 해석해야 하며, 한 개발자가 여러 개의 프론트엔드 스킬을 가졌을 때 발생하는 데이터 중복 문제를 깔끔하게 해결하는 것이 핵심이다.2. Solution비트 AND(&) 연산자를 활용해 포함 관계를 확인하고, 데이터 중복 방지 및 성능을 위해 EXISTS 문을 사용한다.[권장 전략] EXISTS를 활용한 효율적 탐색비트 연산 (D.SKILL_CODE & S.CODE) > 0: 개발자의 코드와 스킬 코드를 이진수로 대조하여 겹치는 비트가 존재할 경우(보유 스킬일 경우) 참을 반환한다... 2026. 2. 15. [SQL/오답] 비트 연산으로 다대다 스킬 매칭: 비트 마스크와 인라인 뷰 (프로그래머스 Lv4) 1. Problem개발자들의 스킬 조합을 분석하여 등급(GRADE)을 매겨야 한다.A: Front End 스킬 AND Python 스킬 보유자B: C# 스킬 보유자C: 그 외의 Front End 스킬 보유자 단순히 특정 언어를 찾는 것이 아니라 'Front End'라는 카테고리 전체와 특정 언어를 교차 검증해야 하며, 등급 간의 우선순위를 정확히 배정하는 것이 핵심 과제이다.2. SolutionWITH 절로 비트 마스크를 생성하고, 인라인 뷰를 통해 SQL 실행 순서 문제를 해결한다.3. Takeaway (비트 연산의 효율성과 쿼리 실행 순서)복합 조건의 등급 분류 쿼리를 작성하며 정립해야 할 객관적 원칙을 정리한다.비트 마스크(Bit Mask)의 효율성: 여러 개의 Front End 코드를 하나하나 O.. 2026. 2. 15. [SQL/오답] Self Join 대장균 3대 가계도 추적: 세대 고정 논리 (프로그래머스 Lv4) 1. Problem대장균 배양 데이터에서 부모-자식 관계를 추적하여 **제3세대(3rd Generation)**에 해당하는 개체의 ID를 추출해야 한다. 데이터 내에는 1세대부터 4세대 이상까지 섞여 있으므로, 기준점(최초 개체)으로부터 정확히 3단계 아래에 위치한 개체들만 골라내는 것이 기술적 과제이다.2. Solution: Self Join을 이용한 계층 연결동일한 테이블을 세 번 연결(GEN1 - GEN2 - GEN3)하여 3대 가계도를 한 줄로 정렬한 뒤, 가장 윗세대가 최초 개체인 경우만 필터링한다.3. Takeaway: 왜 '최초 부모'를 고정해야 하는가?세대 고정의 원리: 단순히 조인만 두 번 수행하면 '할아버지-부모-자식' 관계인 모든 3대 집합이 추출된다. 만약 4세대가 있다면 2세대-3.. 2026. 2. 14. [SQL/오답] 재귀 쿼리와 NOT IN의 함정: 멸종위기 개체 수 산출 (프로그래머스 Lv5) 1. Problem대장균 가계도 데이터에서 각 세대별로 '자식이 없는 개체(멸종위기 개체)'를 찾아 세대별 인원수를 집계해야 한다. 단순한 조인으로는 깊이를 알 수 없는 계층 구조를 탐색해야 하며, '부모 목록에 존재하지 않는 ID'를 정확히 필터링하는 것이 과제이다.2. Solution: 계층 탐색과 존재 여부 검증WITH RECURSIVE를 통해 전 세대를 탐색하며 세대 번호를 부여하고, NOT IN을 활용해 자식 유무를 판별한다.3. Takeaway: 쿼리 설계의 정밀도와 성능 최적화INNER JOIN을 통한 재귀 제어: 재귀 부분에서의 INNER JOIN은 '부모가 존재하는 자식'만을 유효한 행으로 연결한다. 이는 자식이 없는 리프 노드(Leaf Node)에 도달했을 때 재귀가 무한 루프에 빠지지.. 2026. 2. 14. 이전 1 ··· 4 5 6 7 8 9 10 ··· 15 다음