C언어 <math.h>

2026. 3. 11. 16:09TIL

프로그래머스 문제를 풀면서 최대한 문제를 건드리지 않고 풀려고 하다가 오답은 아니지만 최선의 답이 아니였던 답을 내 다시 문제를 풀게 되었다.

 

다음 문제는 제곱근을 확인하는 문제이다.

 

내가 처음에 풀었던 답안은 다음과 같다.

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

long long solution(long long n) {
    long long answer = 0;
    
    for(int x=1; x*x <= n; ++x)
    {
        if(x*x == n)
            answer = (x+1)*(x+1);
    }
    if(answer != 0)
        return answer;
    else
        return -1;
}

기본적인 헤더와 함수를 최대한 활용하려고 건드리지 않고 풀었다. 

하지만 n이 커질수록 x*x <= n의 반복문을 검사하기 때문에 최대 √N번 반복하게 되어 시간이 초과되어 오답으로 된 경우이다.

 

이 문제를 해결하기 위해 C 내에 있는 수학 라이브러리 제곱근 함수 sqrt()를 사용했다.

 

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>

long long solution(long long n) {
    
    long long x = (long long)sqrt(n);
    
    if(x*x == n)
        return (x+1)*(x+1);
    else
        return -1;
}

수정한 코드이다.

sqrt()는 double을 반환하기 때문에 (long long)으로 타입을 맞춰주어야 한다.

 

이렇게 되면 처음에 

 

O( √N )이던 시간복잡도가

O( 1 )로 매우 빨라지게 되어 오류가 나지 않게된다.

 

여기서 sqrt()를 확인하며 수학 라이브러리 함수에 대한 정보가 부족한 것 같아 조금 공부를 해보았다.


<Math.h>

sqrt() 등 다른 수학 라이브러리 함수를 사용하기 위해서는 <math.h>를 상단에 선언해야 한다.

 

sqrt()

방금 사용했던 제곱근 관련 함수이다.

#include <stdio.h>
#include <math.h>

int main() {
    double x = 16.0;
    double result = sqrt(x);

    printf("%f\n", result);
}

이런식으로 사용할 수 있는데, 이렇게 하면

 

4.000000 을 출력한다.

 

특징

  • 반환 타입 : double
  • 입력 값이 음수이면 NaN을 반환

 

거듭제곱 함수 pow()

제곱근 말고도 거듭제곱 함수도 있다.

 

pow()를 사용하면

double result = pow(2, 3);

>> 8

이런식으로 제곱을 구할 수 있다.

 

괄호 앞 부분에는 곱할 수, 뒷 부분에는 몇 번을 곱할지를 입력하면 된다.

 

절댓값 관련 함수 fabs()

실수의 절댓값을 구하는 함수이다.

double x = -3.5;
double result = fabs(x);

이렇게 -3.5를 fabs에 넣고 출력하면

부호가 사라진 절댓값이 출력되는 것을 확인할 수 있다.

 

삼각함수

각도를 계산할 때 사용할 수 있는 함수이다.

 

  • sin(x) : 사인 값
  • cos(x) : 코사인 값
  • tan(x) : 탄젠트 값
double result = sin(0);

예를 들어서 이렇게 sin(0)을 입력하면

0.000000값이 출력된다. 라디안 기준이라는 점이 중요하다.

 

로그 / 지수 함수

  • log(x) : 자연로그
  • log10(x) : 상용로그
  • exp(x) : e^x

자연 로그의 출력 예시

double result = log(10);

 

반올림 함수

  • ceil(x) : 올림
  • floor(x) : 내림
  • round(x) : 반올림

 

올림 예시

double result = ceil(3.2);

자연수 1 간격으로 올림 / 내림 / 반올림 되는 것을 확인할 수 있다.

 

 

'TIL' 카테고리의 다른 글

Unreal Engine C++  (1) 2026.03.27
C++ < String >  (0) 2026.03.12
C++ < STL (기초) >  (1) 2026.03.10
C++ < Template(템플릿) >  (0) 2026.03.10
C++ < 자원 관리(스택 메모리, 힙 메모리, 스마트 포인터) >  (0) 2026.03.09