[프로그래머스/C++] ㅡ LV1 - 정수 제곱근 판별
2021. 4. 3. 23:32ㆍ필요/코딩테스트(프로그래머스)
문제
programmers.co.kr/learn/courses/30/lessons/12934
풀이
#include <cmath>
using namespace std;
long long solution(long long n) {
long long answer = 0;
long long a = sqrt(n);
if (a*a == n) { // 양의 정수x의 제곱인 경우
answer=pow(a+1,2);
}
else { // 아닌 경우
answer=-1;
}
return answer;
}
개념
cmath 라이브러리를 사용한다.
제곱을 구하는 함수는 pow(밑, 지수) 이고, 제곱근을 구하는 함수는 sqrt(값) 이다.
풀이
양의 정수 x의 제곱인지 판별해야한다.
n의 제곱근이 자연수일 경우를 찾으면 된다.
long long 자료형을 사용하므로 n의 제곱근이 자연수가 아닌 경우, 값은 정수형으로 바뀌어 저장된다.
이 과정에서 값이 손상되므로 그 값을 다시 제곱하면 원래의 n이 되지 못한다.
따라서 이를 조건문으로 사용해서 문제를 해결했다.
+a
일단 최대한 라이브러리를 사용하지 않으려고 했다.
n은 long long 자료형을 사용하고 범위가 매우 큰 값까지 존재한다.
양의 정수 x의 제곱인지 확인하기 위해 반복문을 사용하는 것은 시간초과가 나올 것으로 예상된다.
따라서 cmath 라이브러리를 사용하기로 결정했다.
첫 시도에서 몇몇 테스트를 통과하지 못했는데, 이때는 다른 판별 기준을 사용했다.
이때 n/sqrt(n) == sqrt(n) 가 n의 제곱근이 자연수임을 구별해줄 것이라고 생각했다.
이는 n의 제곱근이 자연수일 때의 모든 조건을 만족하지만, 아닌 경우도 종종 만족한다. (더 큰 범위이다)
그 예시는 n=5일 때이다.
'필요 > 코딩테스트(프로그래머스)' 카테고리의 다른 글
[프로그래머스/C++] ㅡ LV1 - 정수 제곱근 판별 (0) | 2021.04.04 |
---|---|
[프로그래머스/C++] ㅡ LV1 - 콜라츠 추측 (0) | 2021.04.04 |
[프로그래머스/C++] ㅡ LV1 - 정수 내림차순으로 배치하기 (0) | 2021.03.27 |
[프로그래머스/C++] ㅡ LV1 - 이상한 문자 만들기 (0) | 2021.03.27 |
[프로그래머스/C++] ㅡ LV1 - 시저암호 (0) | 2021.03.27 |