일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- programmers
- Linux
- on conflict
- c드라이브에서 압축 안될때
- 방화벽정책
- ipv6->ipv4
- java
- 특정ip차단
- 데이터넘기기
- 관리자권한 문제
- 파일이 너무 커서 안들어감
- PostgreSQL
- Docker
- 특정ip접근
- 6tunnel
- 2022 KAKAO BLIND RECRUITMENT
- usb 포맷시스템
- 프로그래머스
- 도커
- mybatis
- usb 공간있는데
- 신고결과받기
- 압축권한
- db
- 로또의 최고 순위와 처저 순위
- c드라이브에서 압축
- 팰린드롬개수
- 폴더압축 권한문제
- maven-install
- LV1
- Today
- Total
개발 기록일지
[LV1]소수 만들기(JAVA) 본문
https://programmers.co.kr/learn/courses/30/lessons/12977
코딩테스트 연습 - 소수 만들기
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때
programmers.co.kr
문제 설명
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항- nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
- nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
입출력 예
num | result |
[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을 만들 수 있습니다.
nums 배열이 주어지면 그중 3개를 골라서 다 더하고 그게 소수인지를 판별하면 되는 문제이다.
for문 3개를 써서 처음부터 순서대로
1 2 3
1 2 4
2 3 4
1 2 7
1 2 6
1 2 4
2 7 6
2 7 4
7 6 4
이런식으로 완탐해서 각각 값을 변수에 담아서 그게 소수이면 카운트를 증가시키면 된다.
소수는 1과 자기 자신으로만 나누어지는 숫자이다.
소스
class Soulution{
public int solution(int[] nums) {
int answer = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
for (int k = j + 1; k < nums.length; k++) {
int sum = nums[i] + nums[j] + nums[k];
if (isPrime(sum) == true) {
answer++;
}
}
}
}
return answer;
}
private boolean isPrime(int n) {
for (int i = 2; i <= (int) Math.sqrt(n); i++) {
if (n % i == 0)
return false;
}
return true;
}
}
근데 여기서 소수를 판별하는 isPrime 에서
배열에서 3개를 골라서 더한값
예를들어 n=30 이라고 가정하면
30은
1*30
2*15
3*10
5*6
6*5
10*3
15*2
30*1
색깔이 변하는 기점으로 좌우 대칭인걸 알 수 있다.
그래서 sqrt 값보다 같거나 작은 값으로 나누어주면 그 이후에 대해서는 계산할 필요가 없다.
루트30 이면 5.xxx 값이고 5까지 나누었을때 나머지가 0이면 소수라고 볼 수 없는것이다.
그래서 i의 범위는 java의 내장함수를 사용해
i <= (int)Math.sqrt(n) 으로 지정해주면된다.
'프로그래밍 > 알고리즘 풀기' 카테고리의 다른 글
[프로그래머스] 모의테스트 팰린드롬 개수 구하기 (0) | 2022.10.12 |
---|---|
[LV1]programmers 로또의 최고순위와 최저순위(JAVA) (0) | 2022.03.15 |
[LV1]programmers 신고결과받기(JAVA) (0) | 2022.03.14 |
프로그래머스 모의테스트- 직사각형의 나머지 한점구하기 (0) | 2021.08.08 |