반응형

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 고양이와 개는 몇 마리 있을까

  동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 출력하는 문제이다. (고양이, 개 순서)

  동물을 종류에 따라 묶기 위해 group by 절을 사용했다.

SELECT ANIMAL_TYPE, COUNT(*) AS count
    FROM ANIMAL_INS
    GROUP BY ANIMAL_TYPE
    ORDER BY ANIMAL_TYPE

 

  문제에서는 고양이와 개라고 특정 지었지만 group by 절을 사용하여 출력하니 정답으로 처리돼었다. 이방법으로 되지않았다면 where절을 사용하여 고양이와 개의 수를 각각 구한 후 union을 사용하는 방법이 있다.

SELECT ANIMAL_TYPE, COUNT(*) AS count
    FROM ANIMAL_INS
    WHERE ANIMAL_TYPE = "Cat"
UNION
SELECT ANIMAL_TYPE, COUNT(*) AS count
    FROM ANIMAL_INS
    WHERE ANIMAL_TYPE = "Dog"

 

2. 동명 동물 수 찾기

  동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 출력하는 문제이다. 이때 이름이 없는 동물은 집계에서 제외한다.

  group by로 그룹으로 나눈 후 그 수가 2 이상이어야 하므로 having절을 사용했다.

SELECT NAME, COUNT(NAME) AS COUNT
    FROM ANIMAL_INS
    GROUP BY NAME
    HAVING COUNT > 1
    ORDER BY NAME

 

  name 컬럼이 null인 레코드를 집계에서 제외하기 위해서 count( )에 컬럼명 name을 넣었다.

  그룹의 수가 2 이상인 즉 1보다 크다는 조건이 있으므로 having count > 1을 썼다.

* 이때 where count > 1이 되면 그룹을 만들기 이전에 검사하기 때문에 문제에서 원하는 결과를 낼 수 없다. 이 문제에서는 where절에서 count를 사용할 수 없기 때문에 실행조차 되지 않는다.

 

  ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블이다.

 

3. 입양 시각 구하기(1)

  이 문제에서는 ANIMAL_OUTS 테이블을 사용했다.

  동물 보호소에서 9시부터 19시까지 각 시간대 별로 입양이 몇 건 발생했는지 출력하는 문제이다.

SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
    FROM ANIMAL_OUTS
    GROUP BY HOUR
    HAVING HOUR >= 9 && HOUR < 20
    ORDER BY HOUR

 

  날짜 형식의 입양일에서 시간만 사용하기 위해 hour( )를 사용해서 원하는 시간만 뽑아내 hour 컬럼으로 만들었다.

  이후 hour 컬럼에 대해서 그룹을 만들고 hour의 조건이 주어지기 때문에 having절을 사용했다.

 

4. 입양 시각 구하기(2)

  이 문제에서도 ANIMAL_OUTS 테이블을 사용했다.

  동물 보호소에서 0시부터 23시까지 각 시간대 별로 입양이 몇 건 발생했는지 출력하는 문제이다.

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

  COUNT만을 사용하는 경우 0인 결과에 대해서는 출력하지 않기 때문에 SET을 사용하여 변수 HOUR_IT를 만든 이후 사용했다.

  HOUR에 HOUR_IT라는 변수를 사용하여 0부터 23까지 넣고, COUNT에는 HOUR(DATETIME)과 HOUR_IT가 일치하는 레코드의 수를 센 후 값을 넣었다.

반응형

+ Recent posts