일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- application layer
- m:n
- 오블완
- @Autowired
- API
- 백준
- mysql
- @SubscribeMapping
- 알고리즘
- Git
- 파이썬
- DTO
- compgen
- 쉘 스크립트
- JPA
- 프로그래머스
- 편향된 지수
- 컴파일 타임 상수
- BindingResult
- 메모리 구조
- 커밋 되돌리기
- JDBC
- 쿠키
- 리눅스
- spring
- 런타임 상수
- allocationSize
- 티스토리챌린지
- 기본키 전략
- intelij spring config
- Today
- Total
둘셋 개발!
[SQL] 프로그래머스 - 특정 세대의 대장균 찾기 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/301650
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
해결
나는 부모ID가 NULL인 대장균의 ID 찾고,
그 대장균의 ID가 부모 ID인 대장균의 ID찾고
그 대장균의 ID가 부모 ID인 대장균의 ID를 찾으면 된다고 생각했다.
그래서 where 조건에 서브쿼리를 3번 작성해봤다.
select ID
from ECOLI_DATA
where PARENT_ID in
(select ID
from ECOLI_DATA
where PARENT_ID in
(select ID
from ECOLI_DATA
where PARENT_ID is NULL)
)
order by ID asc;
그리고 결과는 통과였다.
직관적으로만 쿼리를 작성했는데 너무 간단하게 통과가 돼서 다소 놀랬다.
분명 효율적인 쿼리는 아닐 것 같았기 때문이다. (시간초과 문제로 실패할 줄 알았는데...)
그래서 다른 사람들은 어떻게 해결했나 궁금해서 찾아 봤다.
찾아본 것들 중에 직관적이면서 효율적인 쿼리를 찾았다.
(ref. https://eunsun-zizone-zzang.tistory.com/134)
select F.ID
from ECOLI_DATA AS F
join ECOLI_DATA AS S on F.PARENT_ID = S.ID
join ECOLI_DATA AS T on S.PARENT_ID = T.ID
where T.PARENT_ID is NULL
order by F.ID ASC
join절을 사용해서 해결한 것이였다.
내 쿼리는 PARENT_ID를 비교할 때마다 서브쿼리를 실행하기 때문에 시간복잡도로 보면 O(n^3)이고,
join을 활용한 쿼리는 O(n)이기 때문이다!
다음엔 더 잘 할 수 있겠지.ㅎㅎ
ref.
https://latewalk.tistory.com/278
JOIN과 서브쿼리의 차이
프로젝트에서 쿼리를 튜닝하면서 한가지 궁금증이 생겼다 🎋 쿼리 튜닝을 통한 응답 속도 개선 ( feat. QueryDSL, JPQL )현재 구현된 서비스의 검색 기능들 중 대부분은 조건이 한 개이다. 물론 다양
latewalk.tistory.com
'데이터베이스' 카테고리의 다른 글
[SQL] 프로그래머스 - 상품을 구매한 회원 비율 구하기 (0) | 2025.03.16 |
---|---|
[SQL] 프로그래머스 - 대장균의 크기에 따라 분류하기 2 (feat. 순위 관련 윈도우 함수) (0) | 2025.03.15 |
[MySQL] mysql 스레딩 (0) | 2024.11.12 |
[MySQL] 사용자 식별(1) - 계정 (0) | 2024.11.10 |
[MySQL] 시스템 변수 변경 (1) | 2024.11.09 |