[문제]
소수 만들기
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
● nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
● nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
입출력 예
- 0열 선택0열 다음에 열 추가
- 1열 선택1열 다음에 열 추가
- 0행 선택0행 다음에 행 추가
- 1행 선택1행 다음에 행 추가
- 2행 선택2행 다음에 행 추가
nums
|
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을 만들 수 있습니다.
[풀이]
class Solution {
public int solution(int[] nums) {
int answer = 0;
int count = 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++){
answer = nums[i] + nums[j] + nums[k];
if(isCheck(answer)){
count++;
}
}
}
}
return count;
}
private boolean isCheck(int num){
for(int i = 2; i<num; i++){
if(num%i == 0){
return false;
}
}
return true;
}
}
1. 같은 배열 안에 있는 원소들을 각각 비교해주어야 하기 때문에 삼중for문을 썼고, 각 요소의 다음요소, 다다음요소를 비교해주어야해서 초기화식을 i=0, j=i+1, k=j+1로 써주었다.
2. answer변수에는 세 수를 모두 더한 값을 넣어 주었고, answer에 들어간 값은 isCheck 메서드를 통해 반환값이 true라면 count를 1씩 올라가게 해주었다.
- isCheck메서드는 세 수의 합을 매개변수로 받아 num을 다른 수랑 나누었을 때 0이 나온다면 소수가 아니기 때문에 소수일 때 true를 반환하도록 만들어 주었다.
- i의 범위가 2부터 num보다 작은 수인 이유는, 소수는 1과 자기자신으로만 나누어지는 수이기 때문에 1과 자기자신을 제외해야하기 때문이다.
3. 세 수의 합이 소수라면(true라면) count가 올라가기 때문에 세 수의 합이 소수인 경우의 수 count의 값을 최종 return해주었다.
● 다른 사람 풀이
class Solution {
public int solution(int[] nums) {
int answer = 0;
for (int a = 0; a < nums.length; a++) {
for (int b = (a + 1); b <nums.length; b++) {
for (int c = (b + 1); c < nums.length; c++) {
int sum = nums[a] + nums[b] + nums[c];
boolean confirm = true;
for (int i = 2; i < sum; i++) {
if (sum % i == 0) {
confirm = false;
}
}
if (confirm) answer++;
}
}
}
return answer;
}
}
삼중 for문을 쓰는 방법밖에 생각이 나지 않아 이게 맞는 건가 싶어 많은 사람들의 코드를 둘러 보았는데, 거의 모든 사람이 삼중 for문을 쓴 것 같다.
위 코드는 따로 소수임을 확인하는 메서드와 count변수를 만들지 않았기에 참고용으로 가져와봤다.
[느낀점]
아직도 정녕 이 방법밖에 없는것인가 싶다!!! 분명 뭔가 방법이 있을 것 같은데ㅜㅜ 혼자 더 연구해보거나, 구글링으로 더 멋진 코드를 찾아낸다면 더 적어놔야지!
코딩테스트를 하면서 메서드를 따로 만든 건 이번이 처음인데, 사실 따로 메서드를 만드는게 더 좋은 방법인지, 아니면 위 다른사람 코드처럼 쓰는 게 더 좋은 방법인지 잘 모르겠다. 이 의문에 답이 있는지 없는지도 모르겠다.
빨리 코딩 천재가 돼서 효율적인 코드로 후루루룩룩루 문제를 풀고 싶다!
'코딩테스트' 카테고리의 다른 글
[프로그래머스 Lv.1 / Java] 완주하지 못한 선수 (0) | 2022.02.13 |
---|---|
[프로그래머스 Lv.1 / Java] K번째 수 (0) | 2022.02.12 |
[프로그래머스 Lv.1 / Java] 음양 더하기 (0) | 2022.02.05 |
[프로그래머스 Lv.1 / Java] 내적 (0) | 2022.02.03 |
[프로그래머스 Lv.1 / Java] 숫자 문자열과 영단어 (0) | 2022.01.27 |
댓글