알고리즘 문제: 어떤 양의 정수가 제곱수인지 확인하기
이번 문제는 임의의 양의 정수 n
이 양의 정수 x
의 제곱인지 확인하는 것입니다. n
이 양의 정수 x
의 제곱이라면 (x + 1)^2
을 반환하고, 그렇지 않다면 -1을 반환해야 합니다.
문제 분석
n
이 어떤 양의 정수x
의 제곱이라면,n
은x * x
형태로 표현됩니다. 예를 들어,n = 121
이라면, 이는11 * 11
형태이므로x = 11
입니다.n
이x * x
형태가 아니면 -1을 반환합니다.
접근 방법
- 주어진 수
n
에 대해Math.sqrt(n)
을 사용하여n
의 제곱근을 구합니다. - 제곱근이 정수라면,
(제곱근 + 1)
의 제곱을 반환하고, 정수가 아니라면 -1을 반환합니다.
제약 사항
n
은 1 이상, 50조 이하의 양의 정수입니다. 따라서 이 범위에서 효율적으로 동작할 수 있도록 해야 합니다.
코드 구현 (Java)
public class SquareCheck {
public long solution(long n) {
long sqrt = (long) Math.sqrt(n);
// sqrt * sqrt가 n과 같다면 제곱수로 판단
if (sqrt * sqrt == n) {
return (sqrt + 1) * (sqrt + 1);
} else {
return -1;
}
}
public static void main(String[] args) {
SquareCheck checker = new SquareCheck();
System.out.println(checker.solution(121)); // 144 출력
System.out.println(checker.solution(3)); // -1 출력
}
}
코드 설명
Math.sqrt(n)
를 이용해n
의 제곱근을 구합니다.sqrt * sqrt
이n
과 같은지 확인합니다.- 조건이 참이면
(sqrt + 1) * (sqrt + 1)
을 반환하여 다음 제곱수를 계산합니다. 그렇지 않으면 -1을 반환합니다.
SQL 문제: 흉부외과와 일반외과 의사 정보 조회하기
이번 SQL 문제는 병원의 DOCTOR
테이블에서 흉부외과(CS
)와 일반외과(GS
)에 속한 의사들의 정보를 조회하는 것입니다. 각 의사의 이름, ID, 진료과, 고용일자를 조건에 맞게 정렬하여 출력해야 합니다.
문제 분석
DOCTOR
테이블에서 필요한 데이터는DR_NAME
,DR_ID
,MCDP_CD
,HIRE_YMD
입니다.- 조건에 맞는 진료과 코드(
MCDP_CD
)는 흉부외과(CS
)와 일반외과(GS
)입니다. - 결과는
HIRE_YMD
를 기준으로 내림차순으로 정렬하되, 고용일자가 같을 경우DR_NAME
을 기준으로 오름차순 정렬해야 합니다.
SQL 쿼리
문제에서는 DOCTOR
테이블에서 진료과가 흉부외과(CS) 또는 일반외과(GS) 인 의사의 정보를 조회하고, 고용일자 기준으로 내림차순으로, 고용일자가 같다면 이름을 기준으로 오름차순으로 정렬해야 합니다.
테이블 구조
Column Name | Type | Nullable |
---|---|---|
DR_NAME | VARCHAR(20) | FALSE |
DR_ID | VARCHAR(10) | FALSE |
LCNS_NO | VARCHAR(30) | FALSE |
HIRE_YMD | DATE | FALSE |
MCDP_CD | VARCHAR(6) | TRUE |
TLNO | VARCHAR(50) | TRUE |
DR_NAME
: 의사 이름DR_ID
: 의사 IDLCNS_NO
: 면허 번호HIRE_YMD
: 고용 일자MCDP_CD
: 진료과 코드TLNO
: 전화 번호
예시 데이터
DR_NAME | DR_ID | LCNS_NO | HIRE_YMD | MCDP_CD | TLNO |
---|---|---|---|---|---|
루피 | DR20090029 | LC00010001 | 2009-03-01 | CS | 01085482011 |
패티 | DR20090001 | LC00010901 | 2009-07-01 | CS | 01085220122 |
뽀로로 | DR20170123 | LC00091201 | 2017-03-01 | GS | 01034969210 |
티거 | DR20100011 | LC00011201 | 2010-03-01 | NP | 01034229818 |
품바 | DR20090231 | LC00011302 | 2015-11-01 | OS | 01049840278 |
티몬 | DR20090112 | LC00011162 | 2010-03-01 | FM | 01094622190 |
니모 | DR20200012 | LC00911162 | 2020-03-01 | CS | 01089483921 |
오로라 | DR20100031 | LC00010327 | 2010-11-01 | OS | 01098428957 |
자스민 | DR20100032 | LC00010192 | 2010-03-01 | GS | 01023981922 |
벨 | DR20100039 | LC00010562 | 2010-07-01 | GS | 01058390758 |
SQL 쿼리 예시
다음 SQL 쿼리는 조건에 맞는 데이터를 조회하는 방식입니다:
SELECT DR_NAME, DR_ID, MCDP_CD, HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN ('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC;
예상 결과
DR_NAME | DR_ID | MCDP_CD | HIRE_YMD |
---|---|---|---|
니모 | DR20200012 | CS | 2020-03-01 |
뽀로로 | DR20170123 | GS | 2017-03-01 |
벨 | DR20100039 | GS | 2010-07-01 |
자스민 | DR20100032 | GS | 2010-03-01 |
패티 | DR20090001 | CS | 2009-07-01 |
루피 | DR20090029 | CS | 2009-03-01 |
위와 같은 출력이 되며, 진료과가 CS
와 GS
인 의사들이 고용일자 내림차순으로 정렬된 결과를 확인할 수 있습니다.
'TIL > 스파르타 코드카타' 카테고리의 다른 글
[내일배움캠프] 본캠프 코드카타 20번 문제 (0) | 2024.10.29 |
---|---|
[내일배움캠프] 본캠프 코드카타 18번 문제 (0) | 2024.09.26 |
[내일배움캠프] 본캠프 코드카타 17번 문제 (0) | 2024.09.12 |
[내일배움캠프] 본캠프 코드카타 16번 문제 (0) | 2024.09.11 |
[내일배움캠프] 사전캠프 코드카타 36번 문제 (0) | 2024.09.03 |