[Programmers]シミュレーション試験(Java)-アレイレプリケーション




解決策


捕獲者拍問題のルールは反復的であるため,配列には各捕獲者のルールが含まれており,反復文を用いて答えが一致しているか否かを確認する.そして、被逮捕者が正解した質問の個数を順にanswer配列に入れ、そこからmaxの値を求めた.次に、maxの値をanswer配列の要素と比較し、同じ要素のみをresult配列に順番に入れます.回車時にはresult配列の大きさを3とし、空き地を0に初期化したため、これら不要なものを切除するためにArrays.copyOfRangeを使用した.
逮捕された人が答えた質問の個数を数えるのはいいようですが、最大値を求めることから、もっと効果的な方法はないかと思います.他の人が書いたコードを見たことがありますが、Math.maxの方法を使う以外はほとんど違いません.
import java.util.*;

class Solution {
    public int[] solution(int[] answers) {
        int[] answer= new int[3] ; //수포자들의 맞은 답 개수 저장
        int max=0; //맞은 최대 개수 저장
        int result[] = new int[3]; //제일 많이 맞은 사람 저장
        
        //수포자1
        int wrong_ans1[] = {1,2,3,4,5}; //수포자1의 규칙
        int idx1=0;
        for (int i=0;i<answers.length;i++) {
            if (idx1==5)
                idx1=0;
            if(answers[i]==wrong_ans1[idx1]) //답 맞음
                answer[0]++; //맞은개수 플러스
            idx1++; //인덱스 플러스
        }
    
        //수포자2
        int wrong_ans2[] ={2,1,2,3,2,4,2,5};
        int idx2 = 0;
       
        for (int i=0;i<answers.length;i++) {
            if (idx2==8) 
                idx2=0;
            if (wrong_ans2[idx2]==answers[i])
                answer[1]++;
            idx2++;
        }
        
        //수포자3
        int wrong_ans3[] = {3,3,1,1,2,2,4,4,5,5};
    
        int idx3=0;
        for (int i=0;i<answers.length;i++) {
            if(idx3==10) {
                idx3=0;
            }
            
            if (answers[i]==wrong_ans3[idx3]) {
                answer[2]++;
            }
            idx3++;
           
        }
       
        
        for (int i=0;i<3;i++) {
            if (max<answer[i]) {
                max=answer[i];
            }
        } //맞은 최대개수 구하기
        
        int idx=0;
        for (int i=0;i<answer.length;i++) {
            if(max==answer[i]) { 
                result[idx]=i+1;
                idx++;
            }
        } //맞은 개수가 제일많은 사람을 배열에 담기
        
        return Arrays.copyOfRange(result,0,idx);
    }
}

新学


アレイのコピー


並ぶ必要のない部分をカットするためにArrays.copyOfRangeを調べました.このメソッドでは、コピーする配列のインデックスを直接指定できます.Arrays.copyOfRange(arr,start,end)Arr:コピーするシナリオ
start:コピーを開始するインデックス
end:コピー終了のインデックス

  • 特定の範囲ではなく配列の最初の部分からコピーするにはArrays.copyOf(arr,length)の方法を使用することもできる.

  • 最も一般的な配列複製(インデックス指定X)方法はarr.clone()である.

  • アレイを特定の場所にコピーする場合は、System.arraycopy(a,a_start_idx,b,b_start_idx,length)を使用します.
    a:コピーする配列
    b:貼る案
  • 例:
    https://velog.io/@kekim20/JAVA-%EB%B0%B0%EC%97%B4%EB%B3%B5%EC%82%AC-System.arraycopy%EC%99%80-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%ACshallow-copy%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%ACdeep-copy
  • および이중for문を使用してアレイを複製することもできる.