[4ヤードココアコース]白準2920号問題


2920番問題リンク

初めての試み


問題を誤って理解し,全く異なる方向に解いた.入力値は標準で例として入力されていますが、エラーを理解してユーザーが入力するのではなく、最初から内部で作成して入力すべきだと思います.そこで,ランダム検索により数値を生成する方法について,ランダムクラスを理解した.for文を用いてランダムに8つの入力値を得た.for文を用いてランダム値を得たが,1〜8個の数字しか得られず,重複した値は得られなかった.二重for文で生成されたランダム値の繰返し値がある場合、再生成されます.次に上昇と下降、すなわち、ある値が順番に現れると、ある値をどのように出力するかを繰り返し考えたが、答えは見つからなかった.最初、彼は以下の過程を通じて問題を解決したいと思っていました.
import java.util.Random;
import java.util.Scanner;

public class P2920Messedup {

	public static void main(String[] args) {
			
		Random rd = new Random();
		
		int[] dajangjo = new int[8];
		
		for ( int i = 0; i < 8; i++ ) {
			dajangjo[i] = rd.nextInt(8);
			
			//Check for duplicate numbers
			for ( int j = 0; j < i; j++ ) {
				if ( dajangjo[j] == dajangjo[i]) {
					i--;
					break;
				}
			}
	
		}
			
		//ascending
		Loop1 :
		for ( int k = 0; k < 8; k++ ) {
			if (k + 1 == dajangjo[k]) {
				if (dajangjo[7] == 8) {
					System.out.println("Ascending");
					break Loop1;
				}
				continue;
			}else{
				break;
			}
		}System.out.println("Mixed");
	
	}
}

		
		/*
		 * 숫자 8개를 랜덤으로 입력받아야한다.
		 * 1. 길이가 8인 배열을 생성한다
		 * 2. 그 배열 안에 랜덤으로 숫자를 차례대로 집어넣는다. 어떻게 랜덤으로 숫자를 나오게 하지?!! -> 랜덤클래
		 * 3. 인덱스 0부터 7까지 차례대로 어떤 순서로 나왔는지 판별하고
		 * 		문제에서 요구하는대로 ascending, descending or mixed를 출력한다. 
		 */
		
		/*
		 * 랜덤 클래스에서 나온 숫자를 for문에 의해 dajangjo의 0번인덱스부터 7번인덱스까지 차례대로 넣는다.
		 * 아 근데 숫자는 한번씩만 나와야하는데...어떻게 해결하지? -> 셋클래스, for문
		 * 마지막 for문으로 겹치는 숫자가 있는지 검사했음 일단 겹치지 않는 숫자 8개가 배열에 담겼
		 */

2回目の試み


問題をもう一度読んで、最初からもう一度やります.最初はシャベルで習ったことが役に立ったので、ずっと書き続けました.for文に8個の値を入力する場合、前のランダムクラスの代わりにスキャンクラスを使用し、ユーザーに8個の入力値を入力します.この場合、重複する値を考慮する必要はありません.プレイヤーはすでに異なる1-8数字を入力しているからです.したがって、重複する値をチェックする必要はありません.
入力した値と比較するために、上と下という配列を事前に作成しました.(でも編成の時に隊員のコードを先に見ていたので思い出してそのまま使いました.問題を解く時に他の隊員の会話を聞くのは確かに悪いところがありました.)私のレベルではこのように比較するしかありませんが...アルゴリズムの問題はずっと自分でやりたいと思っています.いずれにしても、
入力した値と比較するためにfor文を用いて独自の論理でコードを記述したが,予想通りに操作しなかった.今から見れば当たり前の結果だ.
import java.util.Scanner;

public class P2920 {

	public static void main(String[] args) {
	
		Scanner sc = new Scanner(System.in);
		
		int[] a = new int[8];
	
		for (int i = 0; i < a.length; i++) {
			a[i] = sc.nextInt();
		}
		sc.close();
		
		int[] ascending = { 1, 2, 3, 4, 5, 6, 7, 8 };
		int[] decending = { 8, 7, 6, 5, 4, 3, 2, 1 };
		
		for (int i2 = 0; i2 < a.length; i2++) {
			if (a[i2] == ascending[i2]) {
				if (a[7] == ascending[7]) {
					System.out.println("ascending");
					break;
				}
				continue;
			}else{
				System.out.println("mixed");
			}
		}
		
		for (int i3 = 0; i3 < a.length; i3++) {
			if (a[i3] == decending[i3]) {
				if (a[7] == decending[7]) {
					System.out.println("decending");
				}
				continue;
		}
		
		}

	}
}

3回目の試み


初めての試みのように、2つの配列をどのように比較するかを考えていたが、答えは見つからなかった.感覚できっと問題を解決できると思っていたが、私の頭の中には絶対に答えがなかった.(リンク)配列の内容を比較できるArraysクラスを検索して見つけた.だからまず質問の答えを知りましたが、とても気分が悪いです.
🌟 a==bでは、==比較演算子がアドレス値を比較します。 Arrays.equals()メソッドは、コンテンツ自体(データ値)を比較します。

package algorithm;

import java.util.Arrays;
import java.util.Scanner;

public class P2920 {

	public static void main(String[] args) {
	
		Scanner sc = new Scanner(System.in);
		
		int[] a = new int[8];
		
		for (int i = 0; i < a.length; i++) {
			a[i] = sc.nextInt();
		}
		sc.close();
		
		int[] ascending = { 1, 2, 3, 4, 5, 6, 7, 8 };
		int[] descending = { 8, 7, 6, 5, 4, 3, 2, 1 };
		
		//배열이 동일한지 비교하려면 Arrays.equals를 사용한다
		//모드 배열 형에 대해 사용가능하다.
		//다차원 배열의 동일성을 확인하려면 Arrays.deepEquals를 사용한다
		//메소드를 사용하는것 말고 for문을 이용해 확인할 방법은 없나?
		
		if (Arrays.equals(a, ascending)) {
			System.out.println("ascending");
		}else if(Arrays.equals(a, descending)) {
			System.out.println("descending");
		}else {
			System.out.println("mixed");
		}

		}

	}
白駿で人の和弦を見た.Arraysを使う人もいれば、forゲートを使う人もいます.その中で私が一番欲しいコードを紹介したいです.
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int[] um = new int[8];
		for(int i = 0; i < um.length; i++) {
			um[i] = sc.nextInt();
		}
		
		String s = "";
		for(int i =0; i < um.length - 1; i++) {
			if(um[i] == um[i+1] - 1) {
				s = "ascending";
			}
			else if(um[i] == um[i+1] + 1) {
				s = "descending";
			}
			else {
				s = "mixed";
                break;
			}
		}
		System.out.println(s);
		sc.close();
	}
}
ソース:https://www.acmicpc.net/source/23695983
for文で比較しようとしたとき、異なる配列(内容が同じ)で比較しようとしました.しかし、1つの配列だけでその数字が昇順か降順かを決定するのに十分です.