본문 바로가기

코딩일기

SQL 코드카타 181 - Draw The Triangle 1

https://www.hackerrank.com/challenges/draw-the-triangle-1/problem?isFullScreen=true

 

Draw The Triangle 1 | HackerRank

Draw the triangle pattern using asterisks.

www.hackerrank.com

 

P(R)은 줄리아가 R개의 행으로 그린 패턴을 나타냅니다. 다음 패턴은 P(5)를 나타냅니다:

* * * * *
* * * * 
* * * 
* * 
*

 

패턴 P(20)을 출력하는 쿼리를 작성하세요.

 

SET @n = 20;

 

@n이이라는 변수를 생성하고 20을 저장한다.

 

WITH RECURSIVE cte AS (
  SELECT @n AS num
  UNION ALL
  SELECT num - 1
  FROM cte
  WHERE num > 1
)

 

with 구문을 통해서 위의 서브쿼리를 cte라고 정의한다. 해당 서브쿼리는 num라는 열에 @n라는 값(최초에는 20) 값을 가진다. 그리고 union all로 기존의 cte쿼리의 num열의 값에 -1을 한 값과 결합을 한다. 그리고 그것을 현재의 num값(num-1이 된 상태이므로 0이 될때까지) 결합하여 num이라는 열에 20, 19, ... , 2, 1이라는 값들을 가지는 테이블을 CTE로 정의한다.

원래 해당사이트에서는 버전문제로 with 구문을 사용할 수 없었지만, 이 문제에서는 버전이 8.3.23으로 with 구문을 사용할 수 있었다.

 

-- SET @n = 20;

-- WITH RECURSIVE cte AS (
--   SELECT @n AS num
--   UNION ALL
--   SELECT num - 1
--   FROM cte
--   WHERE num > 1
-- )

SELECT * FROM cte;

 

위에서 작성한 cte테이블을 출력하면 20, 19, ... , 2, 1이 출력되는 것을 확인 할 수 있다.

 

-- SET @n = 20;

-- WITH RECURSIVE cte AS (
--   SELECT @n AS num
--   UNION ALL
--   SELECT num - 1
--   FROM cte
--   WHERE num > 1
-- )

-- SELECT
    repeat('* ', num)
-- FROM cte;

 

 repeat을 사용해서 *이라는 문자를 현재 열의 num값 만큼 반복하면 완료!\