プログラマーLv.1 (8)


21.01.21 ~ 21.01.26

📌 数値桁数の追加



イニシャルコード

import java.util.*;

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

私が書いたコード

import java.util.*;

public class Solution {
    public int solution(int n) {
        int answer = 0;
        String str = Integer.toString(n);
        for (int i = 0; i < str.length(); i++) {
            answer += n % 10;
            n /= 10;
        }

        return answer;
    }
}
昨日解いた問題と同様に,各ビット数の問題を利用し,同様に10に分かれた残りとシェアを利用した.intはstringと違って、長さが見つからないので、そのまま別のstrに置いてlength()を使い、他人の解答を見ることでより良い方法を見つけました.

他人の解答

import java.util.*;

public class Solution {
    public int solution(int n) {
        int answer = 0;
        while (n != 0) {
            answer += n % 10;
            n /= 10;
        }
        return answer;
    }
}
n != 0なのでnで割って、1の位置しか残っていないまで、シェアが0の場合は繰り返し文を停止します.条件をもっと賢く書けばいいのですが、知っている方法でstrに入れるためには残念な問題です.簡単な練習問題なので気軽に答えたいです

📌 秘密地図(KACA 2018ブラインド採用)



イニシャルコード

import java.util.*;
class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = {};
        
        return answer;
        
    }
}

私が書いたコード

import java.util.*;
class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        String[] str1 = new String[n];
        String[] str2 = new String[n];
        
        for (int i = 0; i < n; i++) {
            str1[i] = Integer.toBinaryString(arr1[i]);
            str2[i] = Integer.toBinaryString(arr2[i]);
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (str1[i].charAt[j] == ' ' && str2[i].charAt[j] == ' ') {
                    answer[i] += " ";
                }
                else {
                    answer[i] += "#";
                }
            }
        }
        
        return answer;
        
    }
}
地図1と地図2の10進数を2進数に変換
->変換後のバイナリ数はstrタイプなので、charat(i)で10110のような数字から1つの位置だけを選択して空白かどうかを決定します
->空白の場合は、答え[i]に「」を挿入し、そうでない場合は「#」を挿入します.この場合、response[i]はnビットの文字列を含む必要があるため、str 1[i]のすべてのビット数jはresponse[i+1]に戻るために末尾に返さなければならない.その前に、「」も「#」も、私たちはずっと追加していました.

そして出会ったこのインデックスエラー...
複文を回すときに書いたインデックスに何か間違いがあるようです.
System.out.print(Arrays.toString(str1));
上のコードで印刷した結果は以下の通りです.
[1001, 10100, 11100, 10010, 1011]
そうです.1で始まる内容は良いのですが、0で始まる内容は外され、後の複文でインデックスエラーが発生した可能性があります.
Integer.toBinaryString(str 1[i])ではなく、他の方法を使用します.
for (int i = 0; i < n; i++) {
            for (int j = n-1; j > 0; j--) {
                str1[i][j] = arr1[i] % 2;
                arr1[i] /= 2;
                str2[i][j] = arr2[i] % 2;
                arr2[i] /= 2;
            }
        }
インデックスエラーも発生します.逆順で挿入するのは私の考えとは違うようです.ここまで来たらすごいシャベルを使っているのではないでしょうか.これは私が考えている瞬間です.他人の解で学ぶのがもっと速く、効率的だと思ったら、急いで他人の解を探しに行きます.呜呜...

他人の解答

class Solution {
    public String decoding(int n1, int n2, int n){
        String zero = "";
        String s = Integer.toBinaryString(n1 | n2); //(1)
        
        if(s.length() < n) { //(2)
            for(int i = s.length(); i < n; i++){
                zero += "0";
            }
        }
        return zero + s;
    }
    
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        for(int i = 0; i < n; i++){
            answer[i] = decoding(arr1[i], arr2[i], n);
            answer[i] = answer[i].replaceAll("[1]", "#"); //(3)
            answer[i] = answer[i].replaceAll("[0]", " "); //(4)
        }
        return answer;
    }
}
(1)javaの授業で習ったビット演算子を聞くのを忘れました...orと同じ役割を持ち、1|0->1、0|0->0です.この問題で要求される「」と「#」を正しく反映するorのビット演算子...これを活用すれば、私のように二重に並べて何度も繰り返す必要はありません.1つの演算子で簡単に解けました!無条件にstrやcharで比較して、反省します.
(2)先頭が0の場合はカットされないように長さを条件として0を追加する方法を選択した.
(3)1が#,0が空白になった場合,関数を用いてAllを置換する.こんないい方法があるとは知らなかった

他人の解答2

class Solution {
  public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] result = new String[n];
        for (int i = 0; i < n; i++) {
            result[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }

        for (int i = 0; i < n; i++) {
            result[i] = String.format("%" + n + "s", result[i]); //(1)
            result[i] = result[i].replaceAll("1", "#");
            result[i] = result[i].replaceAll("0", " ");
        }

        return result;
    }
}
(1)文字列の長さはnでなければならない.1でif文を使用する場合、nより短い場合は先頭に0を追加しますが、ここではStringです.format("%"+n+"s",result[i])を使用してresutl[i]の長さをnに指定します.
strでは、変形がなくてもこの方法が考えられますが、

📌 残り1の数値を検索



イニシャルコード

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 = 2; i < n; i++) {
        	if (n % i == 1) {
            	answer = i;
                break;
            }
        }
        return answer;
    }
}
原理も簡単で、与えられた条件も明確で、一目ですぐに解決できる問題です.

📌 予算



イニシャルコード

class Solution {
    public int solution(int[] d, int budget) {
        int answer = 0;
        return answer;
    }
}
この日は何の日か分からないが、頭が全然回らない.ほほほ、必ずsumを組んで予算と比較しなければならない.絶対に解けないような気がする.多くの時間を費やすよりも、急いで勉強して、今度帰ってくる心理状態で、まず他の人の気を理解することを勉強します.

他人の解答

import java.util.Arrays;
class Solution {
    public int solution(int[] d, int budget) {
        int answer = 0;
        Arrays.sort(d); //(1)
        for (int i = 0; i < d.length; i++) {
            if (d[i] <= budget) {
                budget -= d[i]; //(2)
                answer++;
            }
            else {
                break;
            }
        }
        return answer;
    }
}
(1)まずソートを行い,各部門の金額は昇順に並べられる.
(2)最小の価格から,予算から控除可能な重複文を構成する.
できるだけ多くの部署を支援するのが目標なので、小額が複数のグループのベストチョイスです.
2,3を無条件に組み合わせて予算と比較したいのでsortからのアプローチは考えていません.こんなに簡単に解けるとは思わなかったので、ちょっとでたらめでした.次はそのまま彼を放したううう

📌 2016年



イニシャルコード

class Solution {
    public String solution(int a, int b) {
        String answer = "";
        return answer;
    }
}

私が書いたコード

import java.util.Arrays;
class Solution {
    public String solution(int a, int b) {
        String answer = "";
        Integer[] big = {1, 3, 5, 7, 8, 10, 12};
        Integer[] small = {4, 6, 9, 11};
        //1월이면 일자 - 일자만 해서 구함
        // 2월이면 29일이 마지막 날
        String[] days = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
        
        if (a == 1) { //(1)
            answer = days[(b-1) % 7];
        }
        else {
            for (int i = 1; i < a; i++) { 
                if (Arrays.asList(big).contains(i)) { //(2)
                    b += 31;
                }
                else if (Arrays.asList(small).contains(i)) { //(3)
                    b += 30;
                }
                else { //(4)
                    b += 29;
                } 
            }
            answer = days[(b-1) % 7];
        }
        return answer;
    }
}
以前は大文字と小文字によって他の仕事をする必要があるという問題で、そのようにサンプルでリストを作って、それから書いてきたので、あまり悪くなかったのを覚えています.29日の2月を除き、30日の1月と31日の1月がそれぞれ縛られている.そして、戻る曜日の名前はstrタイプで並んでいます.最初の週は「FRI」で、経過した日付数を7で割った後、残りの日付によって曜日が異なります.1月1日が金曜日に定められているからです.
(1)与えられた日付が1月中であれば,日付のみを除いて曜日を求める.b-1は、1月1日を基準に何回経過したかを計算するためのプロセスである.
(2)a月に到着するまで繰り返し,i月で繰り返す.31日の月であれば、経過日数(b)で30日を積算します.
(3)同様に,30日間の月累計30.
(4)自分だけが29日の2月であれば29日を累計する.
最後に、合計経過日数と日数を7の残り時間で割って、曜日を含む日数の配列で正解曜日を選択して返します.
これは私のできる限りの問題です.あ、整数配列に特定の要素が含まれているかどうかを決めるときにどのような方法を使うのか分からないので検索してみました.私が知っている単純indexOf>0かcontainsは文字列オブジェクトで使えないので調べてみました.Arraysクラスでサポートされているメソッドを使用すると、int配列もtrurとfalseを返します.
自嘲する