일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- declare
- Push
- queryset
- get_object_or_404
- 백준
- hackerrank
- python3
- github
- HTML
- TMS
- 중복제거
- Django
- Visual Studio
- python 3.7
- anaconda3
- Delphi
- PyCharm
- pythonanywhere
- pyhcarm
- delphi 10.3
- blog
- c#
- COMMIT
- 델파이
- advColumnGrid
- MSSQL
- templates
- rank
- dbadvgrid
- GIT
- Today
- Total
DevHyun
Print Prime Numbers 본문
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까지의 소수들 중 어떤 것이라도 나누어 떨어지지 않는다.'
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 |