3週目の解答

86545 ワード

2022.04.11

1.小数を作成


質問する


与えられた数字のうち3つの数字を小数に加算すると、個数を求めてみます.数値を持つ配列numsをパラメータとする場合は、solution関数を完了してnumsの3つの異なる数値の小数を返します.
🔎 内蔵
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文を用いて2からsumで割って小数を求める.三重forクエリの効率を向上させるには,不要な部分を減らす必要があり,else ifとxが同時に無応答器に追加する必要がある.
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文を用いて元の配列の値を逆さにして答え配列に入れる.
2022.04.13

3.ハザード数


質問する


正の整数xを下のスケール数にするには、xをxの桁数の和で除算する必要があります.例えば、18の桁数の和は1+8=9であり、18は9で除算されるので、18は下付き文字数となる.自然数xを入力し、xがハザード数の関数かどうかをチェックし、解を完了します.
🔎 内蔵
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配列に入れ,各数値間を加算できる.文で各ビット数の和を求め、その値を元の値で除算し、残りの値がない場合はtrueを返し、そうでない場合はfalseを返します.
2022.04.14

4.薬水の和


質問する


整数nを受け入れ、nのすべての約数加算値を返す関数は、解を完了してください.
🔎 内蔵
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から入力した数で割って約数を求め、そのまま答えに加算します.
2022.04.15

5.模擬試験


質問する


数学は数学を放棄する人の略語である.「囚人3人組」は模擬試験で数学の問題を全部撮りたいと思っている.最初の問題から最後の問題まで、執胞子は以下の通りである.
1番捕手の撮り方:1,2,3,4,5,1,2,3,4,5...
2番捕手の撮り方:2、1、2、3、2、4、2、5、2、2、3、2、4、2、5...
3番捕手の撮り方:3,3,1,1,2,2,4,5,5,3,3,1,2,2,4,5,5...
最初の問題から最後の問題までの正解が順番に並んでいる場合は、最も多くの質問に答えた人が誰なのか、答えを並べて返すように解答関数を書いてください.
🔎 内蔵
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)));
    }

}

📌 説明する


残念ながらコードはあまり効率的ではありませんが、解くことに意味があります.
問題を解くときに一番悩んでいるのは、ルールが組まれたシナリオをどのように答えの長さと比較するか、最終的な戻り値はシナリオの最大値の1つ以上である可能性があるため、シナリオの長さが異なる可能性があることです.ルールに従って3つの配列を作成し、配列の長さ(ルールの長さ)に従って%を行い、繰り返します.配列長の変化は配列リストを用い,条件に応じて長さを増やして用いることができる.次に、配列リストをint配列に渡すために.stream().mapToInt(Integer::intValue).toArray()を使用しました.