728x90
반응형
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
#include <string>
#include <vector>
#include <cmath>
using namespace std;
long long solution(long long n) {
long long answer = -1;
long long a = sqrt(n);
if(a > 0 && a * a == n){
answer = pow(a + 1, 2);
}
return answer;
}
pow 함수와 sqrt 함수에 대해 알아보던 중 level 1에도 비슷한 문제가 있길래 풀었다.
long long이라는 자료형을 너무 오랜만에 만나버렸고, 양의 정수의 제곱인지 판별해야하는 조건 때문에 조금 더 고민을 했다. long long이 양의 정수만 다루는 자료형이 아닌 걸로 알고 있기 때문이다.
일단 변수 a를 하나 더 만들어주었고, 이 a가 n의 제곱근일 때
a 와 a를 곱하면 n이 나와야하고, 안나오면 복소수인가?
아무튼 그래서 양의 정수여야한다는 조건을 위해 a가 0보다 크다는 조건을 하나 더 달아주었다.
pow(a, b)
a를 b 숫자만큼 제곱해주라는 뜻
그리고 처음부터 answer의 값을 -1로 정의해서 else를 거치지 않아도 -1이 출력되도록 했다.
사실 반복문을 사용해서 이전의 문제와 동일하게 풀려고 했지만 시간 초과가 발생하여 정답 인정이 되지 않았다.
그렇다면 다른 풀이들을 확인해보자.
#include <string>
#include <vector>
#include <math.h>
using namespace std;
long long solution(long long n) {
long long answer = sqrt(n);
return powl(answer, 2) == n ? powl(answer + 1, 2) : -1;
}
이렇게 축약 할 수도 있을 것이고
https://sindh718.tistory.com/14
이런 풀이도 있었다.
그런데 여기서 조금 더 변형을 해보자면
#include <string>
#include <vector>
#include <cmath>
using namespace std;
long long solution(long long n) {
long long answer = -1;
for(long long i = 0; i < sqrt(50000000000000); i++){
if(pow(i, 2) == n){
answer = pow((i + 1), 2);
}
return answer;
}
이렇게 수정할 수도 있겠다.
(내가 뭐라고 훈수질을 둔다가 아니라 공부하는거다!! ㅠㅠ)
728x90
반응형
'프로그래머스 C++ > Level.1' 카테고리의 다른 글
프로그래머스 Level.1 x만큼 간격이 있는 n개의 숫자 (0) | 2023.07.06 |
---|---|
프로그래머스 Level.1 평균 구하기 (0) | 2023.07.05 |
프로그래머스 Level.1 자릿수 더하기 (0) | 2023.07.04 |
프로그래머스 Level.1 약수의 합 (0) | 2023.07.04 |
프로그래머스 C++ Level. 1 짝수와 홀수 (0) | 2023.07.04 |