Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- java
- 김영한
- Android
- http
- pointcut
- 스프링
- QueryDSL
- kotlin
- Thymeleaf
- Spring Boot
- AOP
- JDBC
- db
- 그리디
- Servlet
- 알고리즘
- 백준
- 스프링 핵심 원리
- Greedy
- 인프런
- Proxy
- SpringBoot
- JPQL
- 자바
- jpa
- Exception
- springdatajpa
- transaction
- 스프링 핵심 기능
- spring
Archives
- Today
- Total
개발자되기 프로젝트
[프로그래머스] 소수 만들기 본문
1. 문제
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다.
숫자들이 들어있는 배열 nums가 매개변수로 주어질 때,
nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록
solution 함수를 완성해주세요.
제한사항
- nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
- nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
입출력 예
nums | reuslt |
[1,2,3,4] | 1 |
[1,2,7,6,4] | 4 |
입출력 예 설명
입출력 예 #1
[1,2,4]를 이용해서 7을 만들 수 있습니다.
입출력 예 #2
[1,2,4]를 이용해서 7을 만들 수 있습니다.
[1,4,6]을 이용해서 11을 만들 수 있습니다.
[2,4,7]을 이용해서 13을 만들 수 있습니다.
[4,6,7]을 이용해서 17을 만들 수 있습니다.
2. 문제 정리, 아이디어
- 소수는 1, 자기자신 말고 나누어 지지 않는 수를 의미하다.
- 소수인지 확인하려면 2부터 자기자신-1까지 나눠서 나머지가 있는지 보면 된다.
- 자기 자신에 루트 씌운 값 까지 보면됨 ㅋㅋㅋ
- 흠.. 그런데 숫자 3개의 조합을 어떻게 하쥐?
- 가장 무식한 방법은 for문을 중첩하여 하나씩 다 보면 된다.
3. 코드
class Solution {
public int solution(int[] nums) {
int answer = 0;
int a=0;
int b=0;
int c=0;
for (int i=0; i<nums.length; i++){
a= nums[i];
for (int j=i+1; j<nums.length; j++){
b=nums[j];
for (int k=j+1; k<nums.length; k++){
c = nums[k];
if (isPrime(a + b + c)){
answer++;
}
}
}
}
return answer;
}
public boolean isPrime(int number){
for (int i=2; i< number; i++){
if ((number % i) == 0){
return false;
}
}
return true;
}
}
- 예상한 바와 같이 최악의 경우 시간이 오래 걸리게 된다.
- isPrime부분에서 number/2 지점에서 prime이 아니라고 판정되는 경우이다.
- 어? ? number 직전까지 나눠볼 필요가없다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
4. 개선
class Solution {
public int solution(int[] nums) {
int answer = 0;
int a=0;
int b=0;
int c=0;
for (int i=0; i<nums.length; i++){
a= nums[i];
for (int j=i+1; j<nums.length; j++){
b=nums[j];
for (int k=j+1; k<nums.length; k++){
c = nums[k];
if (isPrime(a + b + c)){
answer++;
}
}
}
}
return answer;
}
public boolean isPrime(int number){
for (int i=2; i<= (number/2)+ (number%2); i++){
if ((number % i) == 0){
return false;
}
}
return true;
}
}
미묘하게 차이가 있다. 몇몇 케이스에서 시간이 단축되었다.
중간 지점이라는 것은 결국에 루트를 씌운 값으로 보면 된다. ㅋㅋㅋㅋ
public boolean isPrime(int number){
for (int i=2; i<=Math.sqrt(number); i++){
if ((number % i) == 0){
return false;
}
}
return true;
}
- 어.... 많이 빨라졌다... 차이가 심한데..?
- 몫, 나머지, 루트를 씌우는 것도 결국 반복문을 돌며서 처리하게된다.
- 이 전과 같이 몫,나머지를 별도로 계산하면 반복문을 두 번 돌게되는 꼴. 그래서 큰 차이가 없었음.
5. GitHub : 211205 PrimeNumber
'코테준비' 카테고리의 다른 글
[프로그래머스] 포켓몬 (0) | 2021.12.06 |
---|---|
[프로그래머스] 체육복 (0) | 2021.12.05 |
[프로그래머스] 내적 (0) | 2021.12.05 |
[프로그래머스] 모의고사 (0) | 2021.12.05 |
[프로그래머스] 음양 더하기 (0) | 2021.12.05 |
Comments