[プログラマアルゴリズム]最小の数を削除


プログラマー練習問題
プログラマ-最小数を削除

🔎 質問する


整数の配列を保存し、arrから最小数の配列を削除する関数を返します.解決策を完了してください.
ただし、返される配列が空の配列の場合は、配列に-1を入力して返します.
たとえばarrが[4,3,2,1]の場合は[4,3,2]を返し、[10]の場合は[1]を返します.

🚫 せいげんじょうけん


arrは長さが1より大きい配列である.
インデックスi,jについて、i≠jの場合、arr[i]≠arr[j]である.

💻 I/O例



📄🤔 コードと解釈プロセス


🔹 1番

public static int[] solution(int[] arr) {
	int len = arr.length;
	if(len==1) return new int[] {-1};

	int min = arr[0];
	for (int i = 1; i < len; i++) {	//가장 작은 수 구하기
		if(min > arr[i]) {
			min = arr[i];
		}
	}
		
	int count = 0;
	for (int i = 0; i < len; i++) {	//가장 작은 수의 개수 구하기
		if(min==arr[i]) {
			count++;
		}
	}
		
	int[] answer = new int[len-count];
	for (int i = 0, k = 0; i < len; i++) {	//가장 작은 수들을 제외한 배열 만들기
		if(arr[i] != min) {
			answer[k++] = arr[i];
		}
	}
    	return answer;
 }

🔸 1号解


最初のコードは大きく3つの段階に分かれています.
  • は最小数の
  • を求めます
  • 最小数量を求めます
  • 最小数を除く配列
  • を作成する.
    論理記述を順番に実現する.
    解いてみるとたくさんの人が
    最小の数が1つしかないと仮定して,問題を解決した.
    質問に入力した数字には重複した言い方はありません.
    一つの問題だけを通過しても、問題の条件によって
    最小の数が複数あると仮定
    アルゴリズムを作るべきだと思います.
    合格したけど.
    集合を利用して問題を解決したい.
    試験を加えて問題を解く.

    🔹 2番

    public static int[] solution(int[] arr) {
    	int[] answer = {-1};
    	if(arr.length == 1) return answer;
    	
    	ArrayList<Integer> list = new ArrayList<>();
    	for (int i = 0; i < arr.length; i++) {	// ArrayList에 옮겨담기
    		list.add(arr[i]);
    	}
    	
    	int minValue = Collections.min(list);	// 가장 작은 수 구하기
    	
    	while(list.indexOf(minValue) != -1) {	// 가장 작은 수들 제거하기
    		list.remove(list.indexOf(minValue));
    	}
    	
    	if(list.size() != 0) {	// 리스트가 비지 않았을 경우 배열에 옮기기
    		answer = new int[list.size()];
            for (int i = 0; i < answer.length; i++) {
    			answer[i] = list.get(i);
    		}
    	}
    	
        return answer; 
    }

    🔸 第二題


    今回はCollectionとAPIを利用しました.
    ちょっと...これは反省に値するコードです.
  • 配列からArrayListへ
  • の集合の最小の方法は最小数の
  • を求めます
  • リストから最小数の
  • を削除する.
  • リストが空の場合はアレイ
  • に移動する.
    論理を順番に実装して記述した.
    そんなに効率的ではないようです.
    まず1日から困難が出た.
    int配列がArraysasList()メソッドでArrayListに移動できると思いましたが失敗しました.
    ArrayListはint型のRapperクラスInteger型であり,自動的に異なるタイプに変換できないため,値をfor文に1つずつ移動する.
    Collectionsクラスの最小メソッドを使用して最小の数を求めてみます.
    私はそれを利用するのは初めてだと知っています.
    確かに方法によって実現されているので、利便性の面では良いです.
    while文とindexOfの使用
    最小の数が複数あると仮定すると、それを外します.
    4番目のリストで、最初の答えを[-1]として作成します.リストが空の場合
    空になっていない場合は、リストを配列に戻します.
    問題は私たちが成功したことだ.
    処理時間はケースによって異なりますが、1番コードよりほぼ遅いです.
    コレクションを正しく利用する方法がまだ分からないからですか?
    集合と集合の方法を使うことで、
    不必要な動作が起こったからですか?
    答えは二つとも

    😳❕ 感想&感想


    私もこの問題はそんなに難しくないと思いますが.
    アルゴリズムの問題を解くたびに反省するようだ.
    コレクションについて1、2回書きます.
    錯覚に恥じる.
    もしあなたが本当に知って書くことができたら、2番のコードを実現しながら
    より高速な処理速度とより簡潔な符号化が可能になります.
    1、2ヶ月Javaを習いましたが、
    私は今データベースとネットワークを勉強しています.
    これらの予習、復習は忙しくて、ジャワさえ見られないでしょう.
    ジャワの代価を学ぶのに時間がかかった.
    アルゴリズムの問題を解くのに十分な練習をしたようだ.
    ジャワについてまだ知らないことが多すぎるようです.
    だから今学んだことが多いからといって、怠け者になってはいけない.
    もう少し睡眠時間を減らしても、アルゴリズムの解を続けます.
    再び足りないところを見て、
    自分の知っている部分をもっと深く理解しなければならない.