3주차 풀이

인소리·2022년 4월 17일
0

Coding Test

목록 보기
3/13

1. 소수 만들기

문제 설명

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

제한사항

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

기본 제공 코드

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

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

        return answer;
    }
}

내 풀이

import java.util.Scanner;

public class Solution11 {
    public int solution(int[] nums) {
        int answer = 0;
        int sum=0;
        for(int i=0; i<nums.length-2; i++) {
            for(int j=i+1; j<nums.length-1; j++) {
                for(int k=j+1; k<nums.length; k++) {
                    sum=(nums[i]+nums[j]+nums[k]);
                    int cnt=0;
                    for(int o=2; o<sum; o++) {
                        if(sum%o==0) {
                            cnt++;
                        }
                    }
                    if(cnt==0) {
                        answer++;
                    }
                }
            }
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        Solution11 s = new Solution11();
        int len=scan.nextInt(); //배열 길이 - 3 이상 50 이하
        int[] nums=new int[len];
        for(int i=0; i< nums.length; i++) {
            nums[i]= scan.nextInt();
        }
        System.out.print(s.solution(nums));
    }
}

풀이 설명

숫자 세 개를 더해야 하기 때문에 for문을 세 개를 돌려준다. 첫 번째 for문은 i가 0부터 시작해서 nums의 길이에서 2를 뺀 길이만큼 증가를 시켜준다. 두 번째 for문은 j를 i에 1을 더한 값부터 시작해서 nums의 길이에서 1을 뺀 길이만큼 증가를 시켜준다. 세 번째 for문은 k를 j에 1을 더한 값부터 시작해서 nums의 길이까지 증가를 시켜준다. 이렇게 한 이유는 숫자 세 개를 더할 때 순서 상관없이 더하는 게 아니여서 중복되지 않아야 되기 때문이다. 숫자 세 개를 더한 값을 sum에 바로 넣어주어 소수를 구하는 for문을 돌려줬다. 먼저 cnt를 0으로 초기화 해준 뒤 2부터 sum에서 1을 빼준 값까지 o를 증가시켜주며 sum을 o로 나눴을 때 나머지가 0이면 cnt를 1씩 증가시켜준다. for문이 끝난 뒤 만약 cnt가 0이면 1과 sum 자기 자신 말고 다른 숫자는 약수가 되지 않는다는 뜻이므로 answer을 1 증가시켜서 소수의 개수를 저장했다.

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

문제 설명

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

제한 조건

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

기본 제공 코드

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

내 풀이

import java.util.Scanner;

public class Solution12 {
    public int[] solution(long n) {
        int[] answer={};
        int cnt=0;
        long o=n;
        while(o>10) {
            o=(o/10);
            cnt++;
        }
        answer = new int[cnt+1];
        for(int i=0; i<answer.length; i++) {
            answer[i]=(n<10) ? (int)n:(int)(n%10);
            n=n/10;
        }

        return answer;
    }
    public static void main(String args[]){
        Scanner scan=new Scanner(System.in);
        Solution12 s = new Solution12();
        Long n = scan.nextLong();
        for(int i=0; i<s.solution(n).length; i++) {
            System.out.print(s.solution(n)[i]+" ");
        }
    }
}

풀이 설명

n의 값을 넣어준 o가 10보다 클 때까지 10으로 나눠주며 카운트를 세준다. 카운트+1만큼 answer 배열의 길이를 정해준 뒤 for문을 이용하여 n이 10보다 작지 않을 때까지는 n을 10으로 나눴을 때의 나머지를 넣어주고 n을 10으로 나눠준 수로 초기화를 해준다. 10보다 작은 수가 되면 n 그대로를 answer에 넣어준다.

3. 하샤드 수

문제 설명

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

제한 조건

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

기본 제공 코드

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

내 풀이

import java.util.Scanner;

public class Solution13 {
    public boolean solution(int x) {
        boolean answer;
        int n = x;
        int sum = 0;
        while(true) {
            sum+=(n%10);
            n=n/10;
            if(n<10) {
                sum+=n;
                break;
            }
        }
        if(x%sum==0)
            answer = true;
        else
            answer =  false;

        return answer;
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        Solution13 s = new Solution13();
        System.out.print(s.solution(scan.nextInt()));
    }
}

풀이 설명

x의 값을 넣은 n을 10으로 나눴을 때의 나머지를 sum에 더해주고 n을 10으로 나눠준 값을 n에 저장한다. 만약 n이 10보다 작게 되면 n 자체를 sum에 더해준 뒤 while문을 빠져나온다. 이때 x를 sum으로 나눴을 때 나머지가 0이라면 하샤드 수가 맞기 때문에 answer에 true를 넣어주고 아닐 시 answer에 false를 넣어주어 리턴한다.

4. 약수의 합

문제 설명

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

제한 조건

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

기본 제공 코드

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

내 풀이

import java.util.Scanner;

public class Solution14 {
    public int solution(int n) {
        int answer = 0;
        for(int i=1; i<=n; i++) {
            if(n%i==0)
                answer+=i;
        }
        return answer;
    }
    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        Solution14 s = new Solution14();
        System.out.print(s.solution(scan.nextInt()));
    }
}

풀이 설명

n을 i로 나눴을 때 나머지가 0이 된다면 i는 n의 약수가 된다. i가 약수가 될 때마다 answer에 i를 더해준 뒤 리턴해주었다.

4. 모의고사

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

기본 제공 코드

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

내 풀이

import java.util.ArrayList;
import java.util.Scanner;

public class Solution15 {
    public int[] solution(int[] answers) {
        int[] a = {1,2,3,4,5};  //수포자1
        int[] b = {2,1,2,3,2,4,2,5};    //수포자2
        int[] c = {3,3,1,1,2,2,4,4,5,5};    //수포자3

        int a_cnt=0;
        int b_cnt=0;
        int c_cnt=0;

        for(int i=0; i<answers.length; i++) {
            if(a[i%a.length]==answers[i])
                a_cnt++;
            if(b[i%b.length]==answers[i])
                b_cnt++;
            if(c[i%c.length]==answers[i])
                c_cnt++;
        }

        ArrayList<Integer> arr = new ArrayList<>();
        int max=Math.max(a_cnt,Math.max(b_cnt,c_cnt));

        if(max==a_cnt)
            arr.add(1);
        if(max==b_cnt)
            arr.add(2);
        if(max==c_cnt)
            arr.add(3);

        int[] answer = new int[arr.size()];
        for(int i=0; i<answer.length; i++) {
            answer[i]=arr.get(i);
        }
        return answer;
    }
}

풀이 설명

수포자 1,2,3의 배열 값들이 answers의 길이에 따라 반복되어야 하므로 (i를 각 수포자 1,2,3의 길이로 나눈 나머지)방과 answers의 (i)방이 같으면 각 수포자 1,2,3의 카운트를 1씩 증가시켜주었다. 그리고 max를 구하기 위해 Math.max() 함수를 사용해보았다. Math.max() 함수는 두 값 중 더 큰 값을 리턴해준다. 비교해야 되는 값은 세 개이므로 Math.max() 함수 안에 Math.max() 함수를 한 번 더 넣어줌으로써 세 개의 값을 비교하였다. 그리고 그 max값과 각 수포자 1,2,3의 카운트가 같다면 add()함수를 써서 각각 이름대로 1,2,3를 넣어주었다. 마지막으로 리턴해줄 answer의 배열 길이를 arr의 size만큼 정해주고 for문을 돌려서 answer 배열 안에 add를 이용해서 넣어줬던 arr의 값들을 넣어줬다.

profile
코딩이라는 감옥에 갇혀 사는 삶

4개의 댓글

comment-user-thumbnail
2022년 4월 17일

삼항연산자를 더 활용하면 if문을 줄일 수 있어요! 잘 풀었네요

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

if문 대신 삼항연산자를 쓰는 것도 좋은 것 같아요

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

블랙 올 화이트로 잘 꾸며놨네! 다음에는 제목 부분과 문제는 다른 색으로 해보는건 어떨까?
이번 문제 어려웠을수도 있는데 잘 풀어줘서 갬동이다

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

풀이 설명이 길 땐 풀이 줄을 나눠도 좋을 것 같아요!

답글 달기