프로그래머스 - 있었는데요 없었습니다

윤민선·2026년 7월 5일

프로그래머스

목록 보기
35/77

문제 설명

ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블을 활용해 보호 시작일보다 입양일이 더 빠른 동물의 ID와 이름을 보호 시작일 오름차순으로 조회하는 문제이다.

테이블주요 컬럼
ANIMAL_INSANIMAL_ID, NAME, DATETIME(보호시작일)
ANIMAL_OUTSANIMAL_ID, NAME, DATETIME(입양일)

두 테이블 모두 ANIMAL_ID를 공통으로 갖고 있어서, 이걸 기준으로 연결할 수 있다.


접근 방법

문제를 읽고 아래 3단계로 풀이 흐름을 정리하였다.

  1. ANIMAL_ID 기준으로 두 테이블 JOIN
  2. 보호시작일보다 입양일이 더 빠른 동물 ID, 이름 조회
  3. 보호시작일 오름차순으로 정렬
    ANIMAL_INS에는 보호시작일(DATETIME)이, ANIMAL_OUTS에는 입양일(DATETIME)이 저장되어 있다. 같은 동물의 두 날짜를 비교하려면 ANIMAL_ID를 기준으로 JOIN해서 한 행으로 합쳐야 한다.

"보호시작일보다 입양일이 더 빠르다"는 조건은 날짜도 숫자처럼 비교할 수 있기 때문에 O.DATETIME < I.DATETIME으로 표현할 수 있다.

2019-12-01 < 2020-01-01  ✅ → 입양일이 보호일보다 빠름 → 이상한 케이스

테이블 이름이 길기 때문에 ANIMAL_INSI, ANIMAL_OUTSO로 별칭을 지정해 코드를 간결하게 작성하였다.

구체적으로 정리한 풀이 흐름:

  1. ANIMAL_INS IANIMAL_OUTS OANIMAL_ID 기준으로 JOIN
  2. WHERE O.DATETIME < I.DATETIME으로 입양일이 보호시작일보다 빠른 케이스 필터
  3. ORDER BY I.DATETIME으로 보호시작일 오름차순 정렬

최종 코드

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.DATETIME < I.DATETIME
ORDER BY I.DATETIME

풀고 나서

이 문제의 핵심은 날짜도 숫자처럼 대소 비교가 가능하다는 것이다. "더 빠른 날짜 = 더 작은 값"을 뜻하기에 O.DATETIME < I.DATETIME 로 표현할 수 있다.

또한 두 테이블에 모두 DATETIME이라는 같은 이름의 컬럼이 있기 때문에, 별칭(I, O)을 붙여서 어느 테이블의 DATETIME인지 명확히 구분해줘야 한다. 이처럼 컬럼명이 겹칠 때는 테이블별칭.컬럼명 형태로 명시하는 습관이 중요하다.

0개의 댓글