일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
will come true
[프로그래머스 / Level1] 정수 제곱근 판별 (Java) 본문
문제
https://programmers.co.kr/learn/courses/30/lessons/12934
기존 코드 (성공)
class Solution {
public long solution(long n) {
long answer = -1;
for(long i=1; i*i <= n; i++){
if(i*i == n){
answer = (i+1)*(i+1);
break;
}
}
return answer;
}
}
- 제곱근을 구하는 코드라는 점이 한눈에 파악되지 않으며, Java 라이브러리를 활용하지 못함.
- 제곱했을때(자신과 자신을 곱했을 때) n과 같은 수를 찾을 때까지 불필요한 연산을 반복하기 때문에 경제적이지 못하며, i*i<=n이라는 for문 수행 범위 또한 넓은 감이 있음.
학습 내용
Math 클래스
java.lang 패키지에 포함된 클래스로, 수학 관련 작업을 위한 메서드와 상수를 제공한다.
파일탐색기로 C:\Program Files\Java\jdk{version} 경로에 있는 'src.zip' 압축파일을 해제한 뒤,
java > lang 패키지 경로를 따라가면 Math클래스의 소스코드를 확인할 수 있다.
Math 클래스 상수
상수 | 설명 |
E | 자연 로그의 밑 (2.7182818284590452354) |
PI | 원주율 (3.14159265358979323846) |
Math 클래스 메서드 (일부)
메서드 | 설명 |
double sin(double a) double cos(double a) double tan(double a) |
삼각함수 |
double toRadians(double angdeg) double toDegrees(double angrad) |
Radian - Degree 각도 단위 변환 |
int max(int a, int b) int min(ing a, int b) |
둘 중 큰/작은 값 반환 |
int round(float a) | 소수점 첫번째 자리에서 반올림 |
double ceil(double a) | 올림 |
double floor(double a) | 내림 |
double log(double a) | 자연로그 계산 |
double random() | 0.0~1.0 사이 난수 값 |
int abs(int a) | 절대값 |
double sqrt(double a) | a의 제곱근 (제곱하면 a가 되는 수) ex) sqrt(9) = 3 |
double pow(double a, double b) | a의 b제곱 ex) pow(2, 3) = 2^3 = 8 |
double exp(double a) | e의 거듭제곱 |
*대부분 매개변수(int, long, float, double)에 따라 오버로딩 되어 있음. 위 표에서는 대표 타입 하나만을 기재
*sqrt = square root(제곱근)
*pow = power(거듭제곱)
개선 코드 (성공)
import java.lang.Math;
class Solution {
public long solution(long n) {
if(Math.pow((int)Math.sqrt(n), 2) == n){
return (long)Math.pow(Math.sqrt(n) + 1, 2);
}
return -1;
}
}
import java.lang.Math;
class Solution {
public long solution(long n) {
return (Math.pow((int)Math.sqrt(n), 2) == n) ? (long)Math.pow(Math.sqrt(n) + 1, 2) : -1;
}
}
- 제곱/제곱근 연산에 Math클래스의 sqrt(), pow() 메서드를 활용
- Math.sqrt() 메서드 반환값은 double인데, 매개변수로 받은 정수형 long변수와 일치하는지 확인해야하기 때문에 int로 형변환 해준 뒤 비교한다.
- int의 제곱은 반드시 int기 때문에 비교과정에서 pow메소드 반환값에 대한 형변환은 필요없으나, 해당 메서드의 반환값(return)은 long타입이어야 하기 때문에 마지막 return에서는 long형변환을 필수로 해야함.
'Algorithm' 카테고리의 다른 글
[프로그래머스 / Level1] 시저 암호 (Java) (0) | 2021.10.29 |
---|---|
[프로그래머스 / Level1] 이상한 문자 만들기 (Java) (0) | 2021.10.26 |
[프로그래머스 / Level1] 콜라츠 추측 (Java) (0) | 2021.10.24 |
[프로그래머스 / Level1] 크레인 인형뽑기 게임 (Java) (0) | 2021.10.22 |
알고리즘 공부하며 나온 개념, 규칙들 정리 (0) | 2021.10.18 |