DevHyun

Print Prime Numbers 본문

SQL/HACKERRANK

Print Prime Numbers

D3V3L0P3R 2020. 10. 29. 19:41

www.hackerrank.com/domains/sql

 

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

 

번역 : 1000 이하의 소수를 PRINT 하라! 각 숫자 간 구분자는 &

 

풀이 : 이것이 medium.. 인것인가? 소수구하기 라니.. 수많은 시행착오 끝에 완성해냈다! 물론 sql로 구하는건 없어서 java를 구하는 식을 참고하였음

 

'소수 n은 2~n-1까지의 소수들 중 어떤 것이라도 나누어 떨어지지 않는다.'

 

ehpub.co.kr/tag/1%EB%B6%80%ED%84%B0-1000-%EC%82%AC%EC%9D%B4%EC%97%90-%EC%86%8C%EC%88%98-%EC%B0%BE%EA%B8%B0/

 

 

1부터 1000 사이에 소수 찾기 – 언제나 휴일

안녕하세요. 언제나 휴일입니다. 이번에는 1에서 1000사이의 정수 중에서 소수(Prime Number, 약수가 1과 자기 자신인 수)를 판별하여 출력하는 소스 코드입니다. 여기에서 사용하는 알고리즘은 가장

ehpub.co.kr

 

DECLARE @OUTPUT NVARCHAR(4000) , @INPUT INT , @LOOP INT , @BOOL BIT , @SELF INT
SET
@OUTPUT = '' 
SET
@LOOP = 2
SET
@INPUT = 2
SET
@BOOL = 'FALSE'
SET 
@SELF = 0;


WHILE @INPUT < 1000
BEGIN
    SET @LOOP = 2
    SET @SELF = @INPUT / 2

    IF (@SELF < 3)
    	SET @BOOL = 'TRUE'
    ELSE
    	SET @BOOL = 'FALSE'

    WHILE @LOOP <= @SELF
    BEGIN
        IF (@INPUT % @LOOP = 0)
        BEGIN
        	SET @BOOL = 'FALSE'
        	BREAK
        END
        ELSE 
        	SET @BOOL = 'TRUE'

        SET @LOOP = @LOOP+1
    END

    IF (@INPUT = 2)
    BEGIN
    	IF (@BOOL = 'TRUE')
    	SET @OUTPUT = CAST(@INPUT AS NVARCHAR)
    END
    ELSE
    BEGIN
    	IF (@BOOL = 'TRUE')
    	SET @OUTPUT = @OUTPUT+'&' +CAST(@INPUT AS NVARCHAR)
    END

    SET @INPUT = @INPUT +1
END

PRINT (@OUTPUT)

 

자 우선 설명을 하자면.. SQL에는 FOR문이 없기때문에 WHILE로 바꾸느라 머리 아팠다.

당연히 RETRUN값을 주는 함수도 표현하는 방법을 몰라서 필드값이 BIT인 필드로 TRUE/FALSE를 표현하였다.

-> @BOOL은 초기값이 FALSE이고 밑의 조건식을 만족하면 TRUE로 바뀌거나, 만족하지 못하면 FALSE를 유지하도록 설계!

 

* 바깥쪽 WHILE문의 상단

: LOOP를 돌때 필요한 LOOP 값(FOR문에서 i ++ 를 구현 하기 위한 용도)을 정의!

: 약수가 없는 수가 소수이므로 *2부터 n/2(자기자신/2)까지만 확인하면 되기 때문에* SELF 값을 INPUT / 2로 지정

: 자기자신을 2로 나눈 값이 3보다 작은 경우는 2,3 밖에 없는데 이 두 숫자 모두 소수이기 때문에 편의상 BOOL 값을 TRUE로 주었다. 

-> 이렇게 지정한 이유는 안쪽 WHILE문에서 @LOOP 보다 @SELF(자기자신)이 작을 경우 아예 WHILE문을 안타버려서 긴급 조치! 3 이상부터는 WHILE문 정상작동 하기때문에 @BOOL을 초기값인 FALSE로 지정.

 

* 안쪽 WHILE문

: LOOP를 돌때 (자기자신/2)보다 큰수는 약수가 될 수 없음 따라서 @LOOP 값은 @SELF보다 작을때까지만 돌고, 자동 증가 값(FOR문에서 i ++ ) 처럼 설정하기

: @INPUT 값을 @LOOP로 나누었을때 나머지가 0이면 약수가 존재한다는 뜻(*소수 n은 2~n-1까지의 소수들 중 어떤 것이라도 나누어 떨어지지 않는다.*)이기 때문에 @BOOL 값을 FALSE로 지정하고 여기서 안쪽 WHILE문을 종료, 나머지가 0이 없을 경우 @BOOL값이 TRUE(소수 임)

 

* 바깥쪽 WHILE문의 하단

: 안쪽 WHILE문을 돌고 나서 @BOOL 값을 확인 후 소수이면 @OUTPUT 변수에 넣어주기.

 

써놓고도 무슨말인지 모르겠다...

특히 *2부터 n/2(자기자신/2)까지만 확인하면 되기 때문에* 부분은 더더욱..

 

핵심은 '소수' 는 약수가 자기 자신과 1밖에 없는 수이기 때문에 이것을 검증하려면 나머지(%) 계산을 해야 한다는 것!

 

 

'SQL > HACKERRANK' 카테고리의 다른 글

New Companies  (2) 2020.11.04
Occupations  (0) 2020.11.03
Draw The Triangle 1  (0) 2020.10.29
Weather Observation Station 5  (0) 2020.10.29
Weather Observation Station 4  (0) 2020.10.29
Comments