거북이-https://velog.io/@violet_evgadn 이전완료

log & 거듭제곱 본문

코딩 테스트 시 알면 좋은 것들

log & 거듭제곱

VioletEvgadn 2022. 12. 30. 17:09

코딩 테스트 시 필요한 이유

사실 코딩 테스트 때 로그는 그렇게까지 중요도가 높지는 않다. 즉, 사용하지 않아도 문제를 풀 수 있다.

 

하지만 필자는  자릿수를 구하는 문제이거나 규칙을 가진 상황에서 특정 값의 Index를 구하는 종류의 문제들은 주로 log를 활용한다.

굳이 이렇게 풀지 않아도 되지만 수학을 좋아했던 예전 기억이 남아 있어서 이런 게 아닐까 싶다.

 

어차피 활용할 거 제대로 한 번 정리해보자고 결정했고, 이왕 정리하는 거 log의 반대 성질을 가진 거듭제곱까지 한 번에 정리하기로 하였다.


Math.log

Java에서 log를 사용하는 방법은 총 3가지 존재한다.

 

밑이 e(자연 상수)인 ln(x) 값을 반환하는 Math.log(x), 밑이 10인 log(x) 값을 반환하는 Math.log10(x), 마지막으로 ln(x+1) 값을 반환하는 Math.log1p(x)이다.

 

실제로 각 메서드가 위에서 기입한 함수 결과를 반환하는지 코드를 통해 확인해보자.

(참고로 자연 상수 e는 Math.E로 사용할 수 있다)

System.out.println("[Math.log는 ln(x)일까?]");
System.out.println(Math.log(Math.E)==1? "맞다" : "틀리다");

System.out.println("[Math.log10은 log10(x)일까?]");
System.out.println(Math.log10(10)==1? "맞다" : "틀리다");

System.out.println("[Math.log1p는 ln(x+1)일까?]");
System.out.println(Math.log1p(Math.E-1)==1? "맞다" : "틀리다");

이렇게 3가지 방법이 존재하지만 사실 Math.log()만 알고 있으면 된다.

그 이유는 수학 공식에는 "로그의 밑변환 공식"이라는 수식이 존재하기 때문이다.

위 이미지가 로그의 밑변환 공식인데 이를 사용하면 Math.log()만 사용해도 모든 log 함수를 만들 수 있다.

 

예를 들어 밑이 2인 로그 log₂(x)를 구하고 싶을 경우 ln(x)/ln(2)를 수행하면 되므로 Math.log(x)/Math.log(2)를 통해 구할 수 있다.

이를 확장시키면 밑이 r인 로그 logᵣ(x)를 구하고 싶을 경우 Math.log(x)/Math.log(r)을 계산하면 구할 수 있게 되는 것이다.

 

따라서 log 관련 모든 함수를 외우지 말고 Math.log()와 로그의 밑변환 공식을 활용하자.

 

◎ 주의할 점!!!!!!

Math.log를 사용할 떄 주의할 점이 있다.

바로 Math.log(0)이 안되도록 주의할 것!

 

알다시피 log 함수는 진수로 0 값이 들어올 수 없다.

마찬가지로 Math.log(0)으로 ln(0)을 만들어버린다면 계산상 오류가 발생할 수 있으므로 0 값이 주입되지 않도록 주의하자.


Math.pow

Java에서 거듭제곱은 Math.pow 함수를 활용한다.

Math.pow(double x, double y) // x^y

Math.pow(double a, double b) 메서드는 aᵇ 결괏값을 반환한다.

이때 알아야 하는 것은 Parmeter인 a와 b의 자료형은 double이고, Math.pow() 결괏값 또한 double 자료형을 가진다는 것이다.

 

이런 특징 때문에 a 거듭제곱을 수행할 때 a*a*...*a 연산을 수행하는 것보다는 Math.pow() 활용을 추천한다.

코드를 통해 왜 Math.pow()를 추천하는지 알아보자.

int a = Integer.MAX_VALUE/2;

System.out.println(a*a);
System.out.println(Math.pow(a,2));

직접 a*a를 수행했을 경우 Overflow 때문에 음수 & 부정확한 연산 결과가 도출되었다.

하지만 Math.pow(a,2)를 통해 거듭제곱을 수행했을 경우 정확한 곱연산 결과가 도출되었음을 확인할 수 있다.

 

Math.pow()는 double 자료형으로 결괏값을 처리하는데 double 자료형은 8 Byte 공간으로 데이터를 처리한다.

즉, 4 Byte를 활용하는 int 자료형보다 더 많은 범위의 수를 나타낼 수 있게 되는 것이다.

 

거듭제곱은 알다시피 연산의 결과증가폭이 기하급수적으로 증가하므로 최대한 넓은 범위를 처리할 수 있는 Math.pow() 연산 사용을 추천하는 것이다.

'코딩 테스트 시 알면 좋은 것들' 카테고리의 다른 글

문자열 뒤집기  (0) 2023.01.03
Compare 관련 메소드  (0) 2022.12.31
N 진법  (0) 2022.12.30
Long & Int 범위  (0) 2022.12.30
Stream을 활용한 Collection to Array & Array to Collection  (0) 2022.12.30
Comments