프로그래밍/JAVA 자바

배열 마무리 / 명령행인수

Heidong 2021. 7. 13. 23:31
반응형

package ex0712;

public class Ex20_Q5 {

	public static void main(String[] args) {
/*
		대각선으로 채우기
		
  1  2  4  7 11
  3  5  8 12 16
  6  9 13 17 20
 10 14 18 21 23
 15 19 22 24 25
*/
		int arr[][]=new int[5][5];
		int n, k;
		
		n=0;
		for(int i=0; i<=8; i++) {
			for(int j=0; j<=4; j++) { //j는 행
				k=i-j;
				if(k<0) continue;
				if(k>4) continue;
				n++;
				arr[j][k]=n;
			}
		}
		
		for(int i=0; i<arr.length; i++) {
			for(int j=0; j<arr[i].length; j++) {
				System.out.printf("%3d", arr[i][j]);
			}
			System.out.println();
		}

	}
}

 

package ex0712;

public class Ex21_Q6 {

	public static void main(String[] args) {
		/*
			A~Z까지 임의의 문자를 난수를 이용하여 발생하고 발생된 문자를
				4*4 배열에 0행 0열부터 대입하여 출력하는 프로그램 작성.
				단, 중복문자는 배제하여 대입한다.			    
		*/
				char ch[][] = new char[4][4];

				for (int i = 0; i < ch.length; i++) {
					for (int j = 0; j < ch[i].length; j++) {
						// ch[i][j]=(char)((Math.random()*26)+'A');
						ch[i][j] = (char) ((Math.random() * 26) + 65);

						gogo:
						for (int a = 0; a <= i; a++) {
							for (int b = 0; b < ch[a].length; b++) {
								if (a == i && b >= j) //이 문자가 나올 자리 앞 까지 모두 비교 그러나 뒷자리는 없기 때문에 비교할 필요가없음
									break gogo;

								if (ch[a][b] == ch[i][j]) { // 중복적인 것이 존재하는 경우
									j--;
									break gogo;
								}
							}
						}
					}
				}

				for (int i = 0; i < ch.length; i++) {
					for (int j = 0; j < ch[i].length; j++) {
						System.out.print(ch[i][j] + "\t");
					}
					System.out.println();
				}
			}

}
package ex0712;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		char [][] a = new char[4][4];

		
		for(int i=0; i<4; i++) {
			for(int j=0; j<4; j++) {
				a[i][j] = (char)((Math.random()*26)+65);
				
				A:
				for(int x=0; x<=i; x++) {
					for(int z=0; z<a[i].length; z++) {
						if(x==i && z>=j) {
							break A;
						}
						
						if(a[i][j] == a[x][z]) {
							j--;
							break A;
						}	
					}
				}
			}
		}
		
		for(int i=0; i<a.length; i++) {
			for(int j=0; j<a[i].length; j++) {
				System.out.printf("%3c",a[i][j]);
			}
			System.out.println();
		}
	}
}

위 2개 코드는 똑같은 소스이다 변수만 다를뿐

라벨 A 부분이 중요하다.

이중 for문으로 다시 배열을 돌면서 확인을 하는것이다.

 

첫번째 if문에서 불필요하게 열과 행을 전체를 다 안돌도록

위에서 완성된 a[i][j] 까지만 돌게 하는것이다.

 

그리고 나서 2번째 if로 넘어가는데 여기서 중복 값 유무를 체크한다.

만약 중복된 값이 있다면 j를 1개 줄여줘야 한다.

 

 

명령행인수

main 함수는 하나의 인수를 가지며 인수는 외부에서 특정 값을 main함수로 전달 받을 목적으로 사용되는 것으로 이때 사용되는 인수를 명령 행 인수(Command Line Argument)라 함

 

정의 설명이 뭔가 어렵다.

 

다른 글을 찾아보면

명령행인수 = 콘솔창에서 프로그램을 실행시킬때 프로그램에 인수 값을 인가하는 것

명령행인수를 처리하기 위해서는 프로그램에서 main 함수에 매개변수를 정의해야한다

 

참고로 패키지가 있으면 콘솔창에서는 작동안함.

 

 

package ex0713;

public class ArgEx {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("명령행인수 예제...");
		
		/*
		for(String s: args) {
			System.out.println(s);
		}
		*/
		
		for(int i=0; i<args.length; i++) {
			System.out.println(args[i]);
		}

	}

}

실행 결과

 

 

배열 복사

package ex0713;

public class Ex02_array {

	public static void main(String[] args) {
		// 배열 복사
		int []a = new int[] {10,20,30};
		int []b = new int[a.length];
		
		System.arraycopy(a, 0, b, 0, a.length); //a배열의 값을 b배열에 복사
		
		System.out.println("a 배열");
		for(int n:a) {
			System.out.print(n + "    ");
		}
		System.out.println();
		
		System.out.println("b 배열");
		for(int n:b) {
			System.out.print(n + "    ");
		}
		System.out.println();

	}

}

System.arraycopy(arr1, 0, arr2, 1, 10); <<

arr1배열의 0위치부터의 끝까지를 arr2의 1위치에 10개의 데이터를 복사한다.

 

2차원 배열 복사

package ex0713;

public class Ex03_array {

	public static void main(String[] args) {
		// 2차원 배열 복사
		
		int[][]a = {{10,20,30},{100,200,300}};
		int[][]b = new int[a.length][a[0].length];
		
		/* 2개 복사 주소가 복사
		System.arraycopy(a, 0, b, 0, a.length);
		
		b[1][1] = 70;
		System.out.println(a[1][1] + " : " + b[1][1]);
		*/
		
		
		//2차원 배열에 값을 복사
		for(int i=0; i<a.length; i++) {
			System.arraycopy(a, 0, b, 0, a.length);
		}
		b[1][1] = 70;
		System.out.println(a[1][1] + " : " + b[1][1]);

	}

}

 

 

마방진 만들기

package ex0712;
import java.util.Scanner;
public class Ex22_Q8 {

	public static void main(String[] args) {
		/*
				홀수를 입력 받아 마방진을 완성하는 프로그램
				입력받은 수가 만약 짝수가 입력되거나 15을 초과하면 다시 입력 받는다.
		*/
				Scanner sc = new Scanner(System.in);

				int arr[][];
				int n;
				int row, col;

				do {
					System.out.print("홀수 ? ");
					n = sc.nextInt();
				} while (n % 2 == 0 || n > 15 || n < 1);
				
				arr=new int[n][n];

				row = 0; //행
				col = n / 2; //1을 넣기 위해 가운데 자리 구하기 열

				for (int i = 1; i <= n * n; i++) { 
					arr[row][col] = i; //숫자 1 넣었음
					
					if(i%n==0) { //배수 규칙을 찾았을때 행만 하나 증가 시키면 된다.
						row++;
					} else { //그렇지 않으면
						row--;
						col++;
					}
					
					if(row<0) row=n-1; //행이 음수면 밑으로 제일 내려라
					if(col>=n) col=0; //열이 벗어났으면 
				}

				for (int i = 0; i < n; i++) {
					for (int j = 0; j < n; j++) {
						System.out.printf("%5d", arr[i][j]);
					}
					System.out.println();
				}
				
				sc.close();
			}

}

 

반응형