CS/Algorism

소수인지 판단할 때 시간 복잡도 줄이기

olsohee 2024. 3. 21. 17:30

https://school.programmers.co.kr/learn/courses/30/lessons/92335

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

위 문제를 풀 때 소수인지 판단하는 메소드를 다음과 같이 구현했었다. 그런데 시간 초과가 났다.

public boolean isPrime(long num) {
	for (int i = 2; i < num; i++) {
		if (num % i == 0) {
			return false;
		}
	}
	return true;
}

 

만약 100이 소수인지 판단한다고 가정하자. 100의 약수는 [1, 2, 4, 5, 10, 20, 25, 50, 100]이다. 이때 1부터 100까지 돌면서 약수인지 판단할 필요 없이, 100의 제곱근을 통해 구하면 더 효율적이다. 100의 제곱근인 10으로, 1부터 10 사이의 값만 돌면서 100으로 나눠떨어지는지? 즉, 약수인지 판단하면 된다. 따라서 제곱근을 구해주는 Math.sqrt() 메소드를 통해 다음과 같이 구현하면 된다.

public boolean isPrime(long num) {
	for (int i = 2; i <= Math.sqrt(num); i++) {
		if (num % i == 0) {
			return false;
		}
	}
	return true;
}

 

'CS > Algorism' 카테고리의 다른 글

[백준] 2531. 회전 초밥  (0) 2024.04.10
[백준] 2146. 다리 만들기  (0) 2024.04.10
[프로그래머스] 디스크 컨트롤러  (1) 2024.03.07
[프로그래머스] 여행경로  (0) 2024.03.06
[백준] 1082. 방 번호  (1) 2024.03.05