3주차 문제풀이

주완·2022년 4월 17일
0

CodingTest

목록 보기
3/4
2022.04.11

1. 소수 만들기

문제

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

🔎 기본제공
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;
        int sum;
        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];
                    for(int x=2; x<=sum; x++) {
                        if (sum % x == 0 && x != sum) break;
                        else if(x==sum) answer++;
                    }
                }
            }

        }
        return answer;
    }
}

💡 전체코드

import java.util.Scanner;

public class Solution {
    public static int solution(int[] nums) {
        int answer = 0;
        int sum;
        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];
                    for(int x=2; x<=sum; x++) {
                        if (sum % x == 0 && x != sum) break;
                        else if(x==sum) answer++;
                    }
                }
            }

        }

        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("개수 입력 : ");
        int input = sc.nextInt();
        int[] nums = new int[input];
        for(int i=0; i<nums.length; i++)
            nums[i] = sc.nextInt();
        System.out.println("결과 : "+solution(nums));
    }

}

📌 풀이설명

3중 for문을 이용해 sum에 3개의 값을 순서대로 더해주고, 그 후 sum이 소수인지 파악하기 위해서 for문을 돌린 후 if문을 활용해 sum을 2부터 나누어보며 소수를 구한다. 3중 for문의 효율을 높이기 위해 필요없는 부분을 줄이는 것이 필요했고, else if로 sum과 x가 같을 때만 anaswer에 더해주는 것이 중요했다.

2022.04.12

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

문제

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

🔎 기본제공
class Solution {
    public int[] solution(long n) {
        int[] answer = {};
        return answer;
    }
}

풀이

📃 제출코드

import java.util.stream.Stream;
class Solution {
    public int[] solution(long n) {
        int[] answer = {};
        int[] origin = Stream.of(String.valueOf(n).split("")).mapToInt(Integer::parseInt).toArray();
        answer = new int[origin.length];
        int leng = origin.length-1;
        for(int i=0; i<=leng; i++){
            answer[i] = origin[leng-i];
        }
        return answer;
    }
}

💡 전체코드

import java.util.Scanner;
import java.util.stream.Stream;

public class Solution {
    public static int[] solution(long n) {
        int[] answer = {};
        int[] origin = Stream.of(String.valueOf(n).split("")).mapToInt(Integer::parseInt).toArray();
        answer = new int[origin.length];
        int leng = origin.length-1;
        for(int i=0; i<=leng; i++){
            answer[i] = origin[leng-i];
        }
        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long num = sc.nextLong();
        for(int i=0; i<solution(num).length; i++){
            System.out.print(solution(num)[i]+" ");
        }

    }
}

📌 풀이설명

정수형 int를 int 배열로 바꾸기 위해서 for문을 돌리는 대신 메소드를 사용하였다. String.valueOf를 이용해 String 배열으로 변환하고 Stream.of(String 배열).mapToInt(Integer::parseInt).toArray();을 통해 String 배열을 int 배열로 바꿔준다. 이를 통해 int를 int 배열로 바꿔 주었다. 그 후 for문을 이용해 원래 배열에 있던 값을 뒤집어 answer 배열에 넣어주었다.

2022.04.13

3. 하샤드 수

문제

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

🔎 기본제공
class Solution {
    public boolean solution(int x) {
        boolean answer = true;
        return answer;
    }
}

풀이

📃 제출코드

import java.util.stream.Stream;
class Solution {
    public boolean solution(int x) {
        boolean answer = true;
        int sum = 0;
        int[] arr = Stream.of(String.valueOf(x).split("")).mapToInt(Integer::parseInt).toArray();
        for(int i=0; i< arr.length; i++)
            sum += arr[i];
        if(x%sum==0) return answer;
        else answer = false;
        return answer;
    }
}

💡 전체코드

import java.util.Scanner;
import java.util.stream.Stream;

public class Solution {
    public static boolean solution(int x) {
        boolean answer = true;
        int sum = 0;
        int[] arr = Stream.of(String.valueOf(x).split("")).mapToInt(Integer::parseInt).toArray();
        for(int i=0; i< arr.length; i++)
            sum += arr[i];
        if(x%sum==0) return answer;
        else answer = false;
        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        if(solution(num)) System.out.println("하샤드 수입니다.");
        else System.out.println("하샤드 수가 아닙니다.");
    }
}

📌 풀이설명

Stream.of(String.valueOf(x).split("")).mapToInt(Integer::parseInt).toArray();를 활용해 int 정수를 int 배열에 집어 넣어 각 자리 숫자 끼리 더할 수 있도록 하였다. for문을 통해 각자리 숫자의 합을 구한 후 그 값으로 원래 값을 나누었을 때 나머지가 없다면 true를 반환, 아니라면 false를 반환한다.

2022.04.14

4. 약수의 합

문제

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

🔎 기본제공
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;
    }
}

💡 전체코드

import java.util.Scanner;

public class Solution {
    public static 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 sc = new Scanner(System.in);
        int num = sc.nextInt();
        System.out.println(solution(num));
    }
}

📌 풀이설명

Scanner를 통해 정수를 입력 받고, for문을 활용해 입력받은 수를 1부터 입력받은 수까지 나누어 약수를 구하고 바로 answer에 더한다.

2022.04.15

5. 모의고사

문제

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

🔎 기본제공
class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        return answer;
    }
}

풀이

📃 제출코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        List<Integer> answer_list = new ArrayList<Integer>();
        int[] cnt = new int[3];

        int[] one = {1,2,3,4,5};
        int[] two = {2,1,2,3,2,4,2,5};
        int[] three = {3,3,1,1,2,2,4,4,5,5};

        int[] one_a = new int[answers.length];
        int[] two_a = new int[answers.length];
        int[] three_a = new int[answers.length];
        for(int i=0; i < answers.length; i++){
            one_a[i] = one[i%one.length];
            two_a[i] = two[i% two.length];
            three_a[i] = three[i% three.length];
        }

        for(int i=0; i< answers.length; i++){
            if(answers[i]==one_a[i]) cnt[0]++;
            if(answers[i]==two_a[i]) cnt[1]++;
            if(answers[i]==three_a[i]) cnt[2]++;
        }

        if(cnt[0]>cnt[1]&&cnt[0]>cnt[2]) answer_list.add(1);
        else if(cnt[1] > cnt[0] && cnt[1] > cnt[2]) answer_list.add(2);
        else if(cnt[2] > cnt[0] && cnt[2] > cnt[1]) answer_list.add(3);
        else if(cnt[0] == cnt[1]){
            if(cnt[0]==cnt[2]){
                for(int i=0; i<3; i++)
                    answer_list.add(i+1);
            }else{
                for(int i=0; i<2; i++)
                    answer_list.add(i+1);
            }
        }else if(cnt[1]==cnt[2]){
            for(int i=0; i<2; i++)
                answer_list.add(i+2);
        }else{
            answer_list.add(1);
            answer_list.add(3);
        }
        answer = answer_list.stream().mapToInt(Integer::intValue).toArray();
        return answer;
    }
}

💡 전체코드

package programmers;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Solution {
    public static int[] solution(int[] answers) {
        int[] answer = {};
        List<Integer> answer_list = new ArrayList<Integer>();
        int[] cnt = new int[3];

        int[] one = {1,2,3,4,5};
        int[] two = {2,1,2,3,2,4,2,5};
        int[] three = {3,3,1,1,2,2,4,4,5,5};

        int[] one_a = new int[answers.length];
        int[] two_a = new int[answers.length];
        int[] three_a = new int[answers.length];
        for(int i=0; i < answers.length; i++){
            one_a[i] = one[i%one.length];
            two_a[i] = two[i% two.length];
            three_a[i] = three[i% three.length];
        }

        for(int i=0; i< answers.length; i++){
            if(answers[i]==one_a[i]) cnt[0]++;
            if(answers[i]==two_a[i]) cnt[1]++;
            if(answers[i]==three_a[i]) cnt[2]++;
        }

        if(cnt[0]>cnt[1]&&cnt[0]>cnt[2]) answer_list.add(1);
        else if(cnt[1] > cnt[0] && cnt[1] > cnt[2]) answer_list.add(2);
        else if(cnt[2] > cnt[0] && cnt[2] > cnt[1]) answer_list.add(3);
        else if(cnt[0] == cnt[1]){
            if(cnt[0]==cnt[2]){
                for(int i=0; i<3; i++)
                    answer_list.add(i+1);
            }else{
                for(int i=0; i<2; i++)
                    answer_list.add(i+1);
            }
        }else if(cnt[1]==cnt[2]){
            for(int i=0; i<2; i++)
                answer_list.add(i+2);
        }else{
            answer_list.add(1);
            answer_list.add(3);
        }
        answer = answer_list.stream().mapToInt(Integer::intValue).toArray();
        return answer;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int q_num = sc.nextInt();
        int[] answers = new int[q_num];
        for(int i=0; i< answers.length; i++)
            answers[i] = sc.nextInt();
        System.out.println(Arrays.toString(solution(answers)));
    }

}

📌 풀이설명

코드가 진심 비효율적으로 짜져서 아쉽지만 푼 것에 의미를 두고...

풀면서 가장 고민했던 점은 규칙이 짜여진 배열을 어떻게 답의 길이까지 for문을 돌려 비교해야 하는지와 최종 리턴 값이 배열로 최대값이 1개일 수도 여러개일 수도 있어서 배열의 길이가 달라질 수 있다는 점이었다. 규칙대로 3개의 배열을 만든 후 배열 길이(규칙의 길이)대로 %를 하여 반복할 수 있도록 하였다. 배열의 길이가 달라지는 것은 배열리스트를 활용해 조건에 따라 길이를 늘려 사용할 수 있도록 하였다. 그리고 배열리스트를 int 배열로 넘기기 위해 .stream().mapToInt(Integer::intValue).toArray()을 사용하였다.

profile
배움을 기록하자

5개의 댓글

comment-user-thumbnail
2022년 4월 17일

stream을 쓰는 방법을 아는 게 멋있네요~ 굿굿

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

다양한 함수들을 잘 활용해서 좋아요!

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

문제의 중요한 부분을 아는것도 중요하지! 비효율적인 코드가 나중엔 효율적인 코드가 되길~!아직 너무 초초해 하지 않아도 괜찮아

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

문제마다 전체코드로 짜다니 정성이 엄청나네요~

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

모의고사 문제 풀이에 엄청난 정성과 열정이 보이네요 멋집니다👍

답글 달기