프로그래머스 입양 시각 구하기 - SQL

syeony·2026년 3월 9일

SQL

목록 보기
2/2


문제 바로가기

오답

아 쉽겠거니 하고 아래와 같이 풀었다.

-- 코드를 입력하세요
SELECT HOUR(DATETIME) AS HOUR, COUNT(SUBSTR(DATETIME,12,2)) AS COUNT
FROM ANIMAL_OUTS
GROUP BY SUBSTR(DATETIME,12,2)
ORDER BY SUBSTR(DATETIME,12,2)

바로 틀렸다...
0시부터 24시까지 출력해야하는데 group by로 해버리면 존재하는 시간만 출력하니 모든 시간이 다 나오지 않는다.

정답

그래서 0부터 23시까지 시간부터 먼저 만들어놓아야한다.

SET @HOUR := -1;

SELECT (@HOUR := @HOUR + 1) AS HOUR,
       (SELECT COUNT(*)
        FROM ANIMAL_OUTS
        WHERE HOUR(DATETIME) = @HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23;

아래는 GPT 설명...

이 SQL은 MySQL 사용자 변수(@변수)를 이용해서 0~23까지 시간을 직접 생성하고, 각 시간에 입양된 동물 수를 세는 방식입니다.


1️⃣ 변수 초기화

SET @HOUR := -1;
  • @HOUR라는 사용자 변수를 만듭니다.
  • 시작값을 -1로 둡니다.

이유는 바로 아래에서

@HOUR := @HOUR + 1

이 실행되기 때문에 첫 값이 0이 되도록 하기 위해서입니다.

실행 흐름

초기값 -1
1번째 실행 → 0
2번째 실행 → 1
3번째 실행 → 2
...

2️⃣ SELECT 문

SELECT (@HOUR := @HOUR + 1) AS HOUR

이 부분이 핵심입니다.

@HOUR := @HOUR + 1
→ 값을 1 증가시키면서 그 값을 반환합니다.

즉 실행될 때마다

실행순서@HOUR 값
10
21
32
......
2423

이렇게 됩니다.

그래서 결과 테이블의 HOUR 컬럼이 0~23이 됩니다.


3️⃣ 입양 수 계산

(SELECT COUNT(*)
 FROM ANIMAL_OUTS
 WHERE HOUR(DATETIME) = @HOUR) AS COUNT

현재 만들어진 @HOUR 값과 같은 입양 시간의 개수를 세는 서브쿼리입니다.

예시

@HOUR = 3 이라면

SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = 3

3시에 입양된 동물 수를 반환합니다.


4️⃣ 반복 횟수 만들기

FROM ANIMAL_OUTS

이 부분은 사실 데이터를 쓰기 위한 목적이 아닙니다.

단순히 SELECT가 여러 번 실행되도록 행 개수를 빌리는 것입니다.

예를 들어 ANIMAL_OUTS가 100행이면
SELECT도 100번 실행됩니다.


5️⃣ 반복 종료 조건

WHERE @HOUR < 23

@HOUR23이 될 때까지만 실행합니다.

실행 흐름

@HOUR = 0
@HOUR = 1
...
@HOUR = 23
→ 종료

그래서 24행(0~23)이 만들어집니다.


6️⃣ 최종 결과 예시

HOUR | COUNT
0    | 0
1    | 1
2    | 0
3    | 2
4    | 0
...
23   | 1

입양이 없는 시간도 0으로 출력됩니다.


7️⃣ 이 문제의 핵심 트릭

이 SQL의 핵심은

1️⃣ 변수로 숫자 생성 (0~23)
2️⃣ 그 숫자를 이용해 서브쿼리로 COUNT

시간 생성 → 그 시간 입양수 조회

패턴입니다.

느낀점

@ 이걸로 변수를 만들수 있다는건 정말 처음 알았다.
뭔 이런 문제가 다 있어 라고 생각했지만 오늘도 하나 배워간다...

profile
cross platform과 aOS, iOS에 관심이 많은 모바일 개발자 지망생 오승연입니다

0개의 댓글