Milky's note

[HackerRank](M) Print Prime Numbers 본문

SQL/SQL 코딩 테스트-HackerRank

[HackerRank](M) Print Prime Numbers

밀뿌 2022. 3. 31. 18:05

 

https://www.hackerrank.com/challenges/print-prime-numbers/problem?isFullScreen=true 

 

Print Prime Numbers | HackerRank

Print prime numbers.

www.hackerrank.com

 

[문제]

Write a query to print all prime numbers less than or equal to 1000.

 Print your result on a single line, and use the ampersand (&) character as your separator (instead of a space).

For example, the output for all prime numbers  <= 10 would be:

2&3&5&7

 

 

[답]

- mysql

set @num = 1;
set @num1 = 1;

SELECT GROUP_CONCAT(NUMB SEPARATOR '&')
FROM (SELECT @num:=@num+1 AS NUMB
      FROM information_schema.tables t1,
           information_schema.tables t2
      ) tempNum
WHERE NUMB <= 1000
AND NOT EXISTS (SELECT *
                FROM (SELECT @num1:=@num1+1 AS NUMA
                      FROM information_schema.tables t1,
                           information_schema.tables t2
                      LIMIT 1000
                      ) tempNum1
                WHERE MOD(NUMB,NUMA) = 0
                AND NUMA != NUMB
               )

 

나왔다... 소수 구하기 문제.....

진짜 아무리 생각해봐도 도저히 떠오르는 게 없었다... 떠오르는 건 수를 나누었을 때 나머지가 자기 자신인 것, set @var을 통해서 변수를 설정해주고 하나씩 올려가면서 그 안의 소수를 찾는것 이 정도로 접근을 하려고 했는데 너무 복잡했다. 

그래서 Discussion을 보면서 내 코드로 습득하는 노력을 했다. 내가 생각한 방식에서 조금만 더 했으면 되는건데 좀 아쉽다...

방식은 간단하였다. 문제에서 지정해준 범위인 1000에서 나머지가 0인 수들을 제거해주는 것이다. 그럼 소수 등장 ! 

이제 이걸 구현을 하려면 먼저 수, 나누는 수 2개의 변수를 설정해준다. (@set num=1, @set num1=1)

변수 설정을 한 후 information_schema.tables를 사용하여 테이블을 지정해준다.

그런데 이 때 information_schema.tables 을 2개를 설정한 이유는 information_schema.tables에는 1000개 미만의 행이 있기 때문 이다. 우리는 1000개의 행이 필요하기 때문에 2개를 설정해주었다.

1000개로 범위 설정을 해준 다음에 1000개의 행에서 나머지가 0인 수 들을 제거해준다.

제거하는 방법은  NOT EXISTS 를 사용하여서 제거를 해준다. 그리고 생성한 2개의 변수를 사용하여 나누기를 한다.

이때 나머지가 0인 수들과 2개의 변수가 같지 않은 수들은 제거를 해준다. 자기가 자기 자신을 나누면 어떤 수던지 나머지가 0이기 때문이다.

그리고 구분자를 '&'로 설정해주라고 했는데 group_concat 함수를 사용하여 한줄에 구분자를 넣고 출력을 할 수 있다.

그냥 concat를 사용해야하나 했는데 이렇게 간단하게 한줄로 출력해주는 함수가 있었다니.... 나중에도 자주 사용할 수 있을 것 같다.

    • group_concat
      기본적인 형태로 사용했을경우 문자열 사이에 쉼표(,)가 붙게 된다.
    • group_concat(구분자 변경)
      구분자를 변경하고 싶을때는 SEPARATOR '구분자' 를 붙여 준다. group_concat(컬럼 separator '구분자')
    • group_concat(중복제거)
      합쳐지는 문자열에 중복되는 문자열을 제거 할때는 distinct 를 사용한다. group_concat(distinct 컬럼)
    • group_concat(정렬)
      문자열을 정렬하여 나타내고 싶으면 order by 를 이용한다. group_concat(order by 컬럼)

 

Comments