소수 만들기


문제 설명

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.


제한 조건

  • nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
  • nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.



입출력 예

numsresult
[1,2,3,4]1
[1,2,7,6,4]4





기본 코드

class Solution {
    public int solution(int[] nums) {
        int answer = -1;

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("Hello Java");

        return answer;
    }
}



정답 코드

class Solution {
    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++){
                    if(isPrime(nums[i]+nums[j]+nums[k])) {
                        answer++;
                    }
                }
            }
        }
        return answer;
    }
    
    boolean isPrime(int num){
        for(int i=2; i*i<=num; i++){
            if(num%i == 0) return false;
        }
        return true;
    }
}



문제 풀이

이 문제를 풀 때 중요한 포인트가 두가지 있다.

  • 삼중 반복문을 돌려 서로 다른 3개의 수를 더하는 것
  • 소수를 구하는 방법

먼저 반복문을 살펴보면 j 포문과 k포문은 각각 상위 반복문의 값+1 부터 시작한다. 그 이유는 서로 다른 3개의 수를 가져와야하기 때문이다. 만약 0부터 시작한다면 이미 했던 반복을 다시 한다. 예를 들어 [1,2,3]의 합과 [2,1,3]은 같다. 0부터 시작하게 되면 방번호의 순서만 다르고 값은 같기 때문에 안된다.

두번째 포인트인 소수를 구하는 방법은 에라토스테네스의 체의 방법을 응용했다. 자세한 내용은 링크를 통해 공유한다. 간단하게 풀어 설명하면 2부터 원하는 수까지 자기 자신을 제외한 모든 배수를 지우는 방법이다. 마지막에는 배수에 해당되지 않는 수, 즉 소수만 남게 된다. isPrime은 원하는 수를 입력받아 반복문을 통해 배수들을 지운다. 만약 나머지가 없다면 배수이기 때문에 false를 return한다. 만약 반복문을 빠져나온다면 배수가 없는 수, 즉 소수이므로 true를 return한다. isPrime을 받아 true이면 소수이기 때문에 answer를 증가시킨다.


문제 링크 🔗 : 소수 만들기


자연수 뒤집어서 배열로 만들기


문제 설명

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.


제한 조건

  • n은 10,000,000,000이하인 자연수입니다.



입출력 예

nreturn
12345[5,4,3,2,1]





기본 코드

class Solution {
    public int[] solution(long n) {
        int[] answer = {};
        return answer;
    }
}



정답 코드

import java.util.*;

class Solution {
    public int[] solution(long n) {
        StringBuilder sb = new StringBuilder(Long.toString(n));
        String re = sb.reverse().toString();
        int[] answer = new int[re.length()];
        
        for(int i=0; i<answer.length; i++)
            answer[i] = re.charAt(i)-'0';
        
        return answer;
        
    }
}



문제 풀이

문제를 풀었던 순서이다.

1. 숫자를 문자열로 바꾸어 뒤집기
2. 뒤집힌 문자열의 크기만큼 배열 만들기
3. 한문자씩 정수로 바꾸어 answer에 담기

먼저 첫번째, 숫자를 문자열로 바꿔준다. 입력받는 숫자가 long 타입이기 때문에 Long.toString()을 사용하여 문자열로 바꿨다. 다음은 문자열을 뒤집기 위해 StringBuilder를 사용한다.
뒤집힌 문자열의 크기만큼 정답 배열의 크기를 지정한다. 그리고 배열의 크기만큼 반복문을 돌려 한글자씩 배열에 담는다. 한글자씩 가져오는 방법은 charAt을 사용했다. 제일 중요한 것은 answer의 배열 타입이 int이기 때문에 char to int를 해줘야 한다는 점이다.

  • Long.toStirng(num) : long 타입의 정수를 문자열로 바꾸기 위해 사용한다.
  • StringBuilder.reverse() : reverse라는 말에서 알 수 있듯이 문자열을 뒤집어준다.

문제 링크 🔗 : 자연수 뒤집어서 배열로 만들기


하샤드 수


문제 설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.


제한 조건

  • x는 1 이상, 10000 이하인 정수입니다.



입출력 예

arrreturn
10true
12true
11false
13false





기본 코드

class Solution {
    public boolean solution(int x) {
        boolean answer = true;
        return answer;
    }
}



정답 코드

class Solution {
    public boolean solution(int x) {
        
        String str = String.valueOf(x);
        int s = 0;
        for(int i=0; i<str.length(); i++)
            s+=str.charAt(i)-'0';
        if(x%s == 0 )return true;
        else return false;

    }
}



문제 풀이

먼저 하샤드 수의 정의를 살펴보면 x의 자릿수의 합으로 x가 나눠지는 수이다. 그렇기 때문에 문제 푸는 과정을 크게 2가지로 나눌 수 있다.

  • x의 자릿수의 합 구하기
  • 자릿수의 합을 x로 나눠지는 지 확인하기

먼저 x의 자릿수의 합을 구한다. 자릿수의 합을 구할 때는 여러 방법이 있지만 본인은 개인적으로 문자열로 바꾸어 한자릿수씩 가져오는 걸 선호한다. x값을 문자열로 바꾸기 위해 String.valueOf()를 사용했다. 그 다음 문자열의 길이만큼 반복문을 돌려 문자 하나씩 가져와 int형으로 바꾼 후 더해준다. 문자 하나씩 가져오는 건 charAt을 사용했고, char를 int로 바꿔주기 위해 '0'을 뺐다.

자릿수의 합을 구했다면 x를 합으로 나누어 나머지가 있는 지 체크한다. 나머지가 없다면 나눠지는 수이므로 하샤드 수이다.

문제 링크 🔗 : 하샤드 수


약수의 합


문제 설명

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.


제한 조건

  • n은 0 이상 3000이하인 정수입니다.



입출력 예

nreturn
1228
56





기본 코드

class Solution {
    public int solution(int n) {
        int answer = 0;
        return answer;
    }
}



정답 코드

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=1; i<=n; i++)
            if(n%i == 0) answer+=i;
        return answer;
    }
}



문제 풀이

약수를 구하는 방법은 간단하다. 1부터 구하려는 수까지 반복문을 돌려 i로 나눠지는 수가 약수이다. 그 이유는 약수는 어떤 수를 나눠떨어지게 하는 수인데 나머지가 0이라면 나눠지는 수이기 때문이다.

문제 링크 🔗 : 약수의 합


모의고사


문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.


제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.



입출력 예

answersreturn
[1,2,3,4,5][1]
[1,3,2,4,2][1,2,3]





기본 코드

class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        return answer;
    }
}



정답 코드

class Solution {
    public static int[] solution(int[] answers) {
        int[] answer;
        
        int[] one = new int[]{1,2,3,4,5};
        int[] two = new int[]{2,1,2,3,2,4,2,5};
        int[] three = new int[]{3,3,1,1,2,2,4,4,5,5};
        
        int[] score = new int[3];

        for(int i=0; i<answers.length; i++){
            if(answers[i] == one[i%5])  score[0]++; 
            if(answers[i] == two[i%8])  score[1]++;
            if(answers[i] == three[i%10]) score[2]++;
        }
        
        int max = score[0];
        for(int i=0; i<3; i++){
            if(score[i] > max){ max = score[i]; }
        }
        
        int cnt = 0;
        for(int i=0; i<3; i++){
            if(score[i] == max){ cnt++; } 
        }

        answer = new int[cnt];
        int idx = 0;
        for(int i=0; i<3; i++){
            if(score[i] == max) answer[idx++] = i+1;
        }
        return answer;
    }
}



문제 풀이

먼저 각 학생이 문제 푸는 방법을 배열로 담아준다. 학생들의 정답은 일정한 주기로 반복되기 때문에 정답과 학생의 답이 일치하다면 각 학생의 점수를 올려준다. 다음으로 점수의 최댓값을 찾는다. 이 최댓값은 배열로 return 해줘야하기 때문에 학생 중 최댓값과 일치하는 학생이 몇명인지 찾은 후 배열로 크기를 선언한다.
학생의 점수가 최댓값과 같으면 answer방에 학생의 번호를 넣어준다. 이때 배열은 1이 작기 때문에 i+1을 해야 학생의 번호가 들어가고, answer방은 최댓값을 넣을 때마다 인덱스가 증가하기 때문에 i가 아닌 idx를 사용했다.

문제 링크 🔗 : 모의고사



profile
헐 제가 회사를 다니면서 개발을 하고 있어요 이게 무슨 일이죠?

7개의 댓글

comment-user-thumbnail
2022년 4월 17일

함수에 대한 설명이 있고 중요한 건 색깔과 굵기로 표시해서 보기 좋아요!

답글 달기
comment-user-thumbnail
2022년 4월 17일

함수에 대한 설명이 있고 중요한 건 색깔과 굵기로 표시해서 보기 좋아요!

답글 달기
comment-user-thumbnail
2022년 4월 18일

모의고사 문제가 어려웠는데 해석까지 같이 보니까 이해하기 좋습니다

답글 달기
comment-user-thumbnail
2022년 4월 18일

문제마다 문제 풀이가 자세하고 꼼꼼히 적혀 있어 좋은 것 같아요!

답글 달기
comment-user-thumbnail
2022년 4월 18일

배열을 뒤집는 문제는 저 함수를 쓰면 간결하게 해결할 수 있군요! 배우고 갑니다!

답글 달기
comment-user-thumbnail
2022년 4월 18일

함수들에 대한 설명을 잘 적어놔서 보기 좋습니다!

답글 달기
comment-user-thumbnail
2022년 4월 18일

문제 풀이가 엄청 자세하게 적혀있어서 이해하기 좋았습니다!

답글 달기