부트캠프(Java)

자바/스프링 개발 부트캠프 5일차 (2차원배열 , 객체)

동곤일상 2025. 2. 6. 17:36
반응형

2차원배열

배열의 배열

자바는 1차원배열을 이용해 2차원배열을 구현한다.

package chap05;

import java.util.Arrays;

/*
 * 2차원배열은 1차원배열의 참조변수의 배열 .(배열의 배열)
 */
public class ArrayEx07 {

	public static void main(String[] args) {
		int[][] arr = new int[2][3];
		//2행3열짜리 배열
		arr[0][0] = 10;
		arr[0][1] = 20;
		arr[0][2] = 30;
		arr[1][0] = 40;
		arr[1][1] = 50;
		arr[1][2] = 60;
		
		System.out.println("arr참조값:"+arr);
		System.out.println("arr[0]참조값:"+arr[0]);
		System.out.println("arr[1]참조값:"+arr[1]);
		
		System.out.println("arr.length :"+arr.length);
		System.out.println("arr[0].length : "+arr[0].length);
		System.out.println("arr[1].length :"+arr[1].length+"\n");
		
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				System.out.print("arr["+i+"]["+j+"]="+arr[i][j]+" ");
			}System.out.println();
			
		}
	}	
}


arr참조값:[[I@28a418fc
arr[0]참조값:[I@1be6f5c3
arr[1]참조값:[I@6b884d57

arr.length :2
arr[0].length : 3
arr[1].length :3

arr[0][0]=10 arr[0][1]=20 arr[0][2]=30 
arr[1][0]=40 arr[1][1]=50 arr[1][2]=60

 

arr.length는 행의 갯수임을 알 수 있다.

각 행마다 참조값이 다른것도 확인

 

for (int[] is : arr) {
			String string = Arrays.toString(is);
			System.out.println(string);
		}

System.out.println("1차원 배열의 객체변경");
		int[] arr1 = {1,2,3,4,5};
		arr[1] = arr1;
		for (int[] is : arr) {
			String string = Arrays.toString(is);
			System.out.println(string);
		}

[10, 20, 30]

[40, 50, 60]

1차원 배열의 객체변경

[10, 20, 30]

[1, 2, 3, 4, 5]

 

//arr[0].length ==3

// arr[1].length==5

 

arr[1]이 참조하고있던주소가 arr1 로 바뀜 

 

arrp[1]이 원래 참조하고있던 인스턴스[40,50,60]은

이제 GC에 의해 삭제됨


행 , 열의 합 구하기 예제 

(2차원배열)

package chap05.exam;

import java.util.Arrays;

/*
 * 2차원배열 행의합과 열의 합을 출력
 */
public class Exam5 {
	public static void main(String[] args) {
		int[][] arr = new int[3][2];
		arr[0][0] = 10;arr[0][1] = 20;
		arr[1][0] = 30;arr[1][1] = 40;
		arr[2][0] = 50;arr[2][1] = 60;

		
		arr[1] = new int[] {100,200,300};
		
		for (int[] is : arr) {
			System.out.println(Arrays.toString(is));
		}
		for (int i = 0; i < arr.length; i++) {
			int sum1=0;

			for (int j = 0; j <arr[i].length; j++) {
				sum1+=arr[i][j];
			}System.out.println(i+"행의 합 "+sum1);
		}

		System.out.println("열의합 =====");
		int maxlen = 0;
		
		//열의 최댓값추출
		for (int i = 0; i < arr.length; i++) {
			if(maxlen < arr[i].length) {
				maxlen = arr[i].length;
			}
		}
		
		//여기서는 maxlen이 3이므로 크기 3의 배열이만들어짐
		int col[] =new int[maxlen];
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j <arr[i].length; j++) {
				col[j]+=arr[i][j];
				//col[0] = arr[0][0] + arr[1][0] + arr[2][0]
				//col[1] = arr[0][1] + arr[1][1] + arr[2][1]
				//col[2] =             arr[1][2]
			}
			
			
		}
		for (int i = 0; i < col.length; i++) {
			System.out.println(i+"열의 합 : "+col[i]);
		}
	}
}


[10, 20]
[100, 200, 300]
[50, 60]

0행의 합 30
1행의 합 600
2행의 합 110

열의합 =====
0열의 합 : 160
1열의 합 : 280
2열의 합 : 300

 


가변 배열 (2차원)

package chap05;

/*
 * 가변배열 : 다차원배열에서만 가능
 * 	첫번째 배열의 갯수만 설정하고 나머지값을 설정X
 */
public class ArrayEx9 {
	public static void main(String[] args) {
		
		int arr[][] = new int[3][]; //가변배열 (3행짜리 배열)(열은 알아서)
		arr[0] = new int[] {10,20};
		arr[1] = new int[] {30,40,50};
		arr[2] = new int[] {60};
		
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				System.out.print("arr["+i+"]["+j+"]="+arr[i][j]);
				if(j!=arr[i].length-1) {System.out.print(", ");}
				
			}System.out.println();	
		}
	}
}

arr[0][0]=10, arr[0][1]=20
arr[1][0]=30, arr[1][1]=40, arr[1][2]=50
arr[2][0]=60

 


예제문제( 가변배열 이용)

 

여기서알아야할것

빈 배열은 0 으로채워져있다

 

package chap05.exam;

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

/*
 * 배열의행의값을 입력받아 0으로초기화된 배열 출력
 * 
 * [결과]
 * 배열의행을 입력 : 3
 * 0
 * 00
 * 000
 */
public class Exam06 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.print("배열의행을 입력 : ");
		int hang = scan.nextInt();
		int[][] arr = new int[hang][];
		
		for (int i = 0; i < arr.length; i++) {
			arr[i] = new int[i+1];  
			//arr[0] = new int[1]
			//arr[1] =  new int[2] ........
			//만들기만 한다면 0값이 들어가게됨
		}
		
		for (int[] cs : arr) {
			System.out.println(Arrays.toString(cs));
		}
	}
}


배열의행을 입력 : 5
[0]
[0, 0]
[0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0, 0]

저 위에

arr[i] = new int[i+1]; 

(( arr[0] = new int[1]  , arr[1] =  new int[2] ))은

가변배열에서만 사용하는 구문인데

 

i번쨰 행의 열의 길이를 지정해주는것임.

 


이 알고리즘을 응용해서

0으로 초기화된 배열이아닌

하나씩 증가하는 배열을 만들어봄

 

package chap05.exam;

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


public class Exam7 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.print("배열의행을 입력 : ");
		int hang = scan.nextInt();
		int[][] arr = new int[hang][];
		int sum=0;
		
		for (int i = 0; i < arr.length; i++) {
			arr[i] = new int[i+1];  
			for (int j = 0; j < i+1; j++) {
				arr[i][j] = ++sum; 
			}
		}
		for (int[] cs : arr) {
			for(int a : cs) {
				System.out.printf("%3d",a);
			}System.out.println();
		}
	}
}

 

 


가변배열을 이용한 예제 

 

딱보니 10행10열이었고 숫자10을 입력받은 후

1부터10까지의 더한값부터 1까지

내려가는 알고리즘이었다.

 

높이를 입력받아 만들어보았다.

package chap05.exam;


import java.util.Scanner;

public class Exam08 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.print("높이를 입력하세요 : ");
		int hang = scan.nextInt();
		int sum=0;
		//1. 가변배열생성
		int[][] a = new int[hang][];
		
		for (int c = 1; c <= hang; c++) {
			sum+=c;
		}
		//2 각 행의 1차원 배열의 객체생성
		for (int i = 0; i < a.length; i++) {
			a[i] = new int[i+1];
		
			for (int j = 0; j < i+1; j++) {
				//3.arr배열에 숫자 넣기
				a[i][j] = sum--;	
			}
		}
		
		for (int[] is : a) {
			for(int b : is) {
				System.out.printf("%4d",b);
			}System.out.println();
		}
	}
}

 

 

 

for (int i = 0; i < a.length; i++) {
			a[i] = new int[i+1];
			//i행의 열 갯수를 지정해준다.(행이 높아질수록 열도 많아지게끔)
			for (int j = 0; j < i+1; j++) {
				a[i][j] = sum--;
				
			}
		}

이쪽부분이 중요하다 

행의 크기는 입력으로 받아 놓은 후

a.length(배열의 행 갯수) 만큼 반복문을 설정하고

 

i 행에  i+1 크기의 배열객체생성 

(  a[i] = new int[i+1];  )

 

( j 번 : 0 <=  j < i+1 까지 반복)

그리고 i행j번에  sum을 넣은 후 감소시켜주면 된다.

 

하나의 예를 들겠다

 

2행에 넣는다고 치면 

1. a[2] =  new int[3]      3개의열이생김

2. a[2][0]    ,   a[2][1]    ,   a[2][2]   총 3개의 값을 넣음 

 

a[0][0]

a[1][0]   a[1][1]

a[2][0]   a[2][1]  a[2][2] 

....................................................

 

 과같은 모습이 나타남

 

향상된 for문을 이용해 각 배열의 요소 모두출력


 

배열의 복사

 

1. for문을 이용해 새로운배열에 요소 하나하나를 복사

 

2.System.arraycopy(); 

 

3.Arrays.copyOf() 함수

 

4. 얕은 복사

package chap05;

import java.util.Arrays;

/*
 * 배열의크기변경
 *새로운 배열 객체 생성해 배열 요소값을 복사
 * 1. for구문을 이용 요소 하나하나를 복사 
 * 2. System.arratcopy()함수 이용
 */
public class ArrayEx10 {
	public static void main(String[] args) {
		int [] arr1 = {10,20,30};
		//arr1 배열보다 더 큰 배열을 생성해
		//arr1의 배열값저장 후 합계를 마지막요소에저장
		
		//arr1.length = 4 ;  크기변경은 불가능
		
		int [] arr2 = new int[arr1.length+1];
		
		System.out.println("1.for문을 이용해 복사");
		//for문으로 배열값 복사하기
		for (int i = 0; i < arr1.length; i++) {
			arr2[i] = arr1[i];
			arr2[arr1.length] += arr1[i];}
		
		
		for(int a : arr2) {
			System.out.print(a);
			if(a!=arr2[arr1.length]) {
				System.out.print(",");}
			
		}System.out.println();
		
		//2 System.arraycopy()함수 이용
		System.out.println("\nSystem.arraycopy()함수");
		int[] arr3 = new int[10];
		System.arraycopy(arr2, 0, arr3, 2, arr2.length);
		//arr2의 0번부터의 값을 
		//arr3의 2번인덱스~arr2.length까지 넣는다
		//arraycopy(원본배열, 원본배열의시작index , 복사배열 ,복사배열의시작index , 요소의 갯수)
		
		for (int i : arr3) {
			System.out.print(i+",");
		}System.out.println();
		
		//3.Arrays.copyOf() 함수이용
		System.out.println("\nArrays.copyOf() 함수");
		int[] arr4 = Arrays.copyOf(arr3, 5);
		for (int i : arr4) {
			System.out.print(i);
			if(i!=arr4[arr4.length-1]) {
				System.out.print(",");
			}
		}System.out.println();
		
		System.out.println("\n얕은복사"); //객체 자체가복사됨
		int[] arr5 = arr4;
		for (int i : arr5) {
			System.out.print(i);
			if(i!=arr5[arr5.length-1]) {
				System.out.print(",");
			}
		}
		
		System.out.println("arr1 : ");
		for (int i : arr1) {
			System.out.print(i);
			if(i!=arr1[arr1.length-1]) {
				System.out.print(",");
			}
		}System.out.println();
		
		System.out.print("arr2 : ");
		for (int i : arr2) {
			System.out.print(i);
			if(i!=arr2[arr2.length-1]) {
				System.out.print(",");
			}
		}System.out.println();
		
		System.out.print("arr3 : ");
		for (int i : arr3) {
			System.out.print(i+",");

		}System.out.println();
		
		System.out.print("arr4 : ");
		for (int i : arr4) {
			System.out.print(i+",");
		
		}System.out.println();
		
		System.out.print("arr5 : ");
		for (int i : arr5) {
			System.out.print(i);
			if(i!=arr5[arr5.length-1]) {
				System.out.print(",");
			}
		}System.out.println();
		
	}
	}

1.for문을 이용해 복사

10,20,30,60

 

System.arraycopy()함수

0,0,10,20,30,60,0,0,0,0,

 

Arrays.copyOf() 함수

0,0,10,20,30

 

얕은복사

0,0,10,20,30

 

arr1 : 10,20,30

arr2 : 10,20,30,60

arr3 : 0,0,10,20,30,60,0,0,0,0,

arr4 : 0,0,10,20,30

arr5 : 0,0,10,20,30

 

배열문제

1. 참조 타입에 대한 설명으로 틀린 것은 무엇입니까?

  1. 참조 타입에는 배열 , 열거 , 클래스 , 인터페이스가 있다.
  2. 참조 타입 변수의 메모리 생성 위치는 스택이다.  
  3. 참조 타입에서 ==,!= 연산자는 객체 번지를 비교한다. 
  4. 참조 타입은 null 값으로 초기화할 수 없다.X

2. 자바에서 메모리 사용에 대한 설명으로 틀린 것은 무엇입니까?

  1. 로컬 변수는 스택 영역에 생성되며 실행 블록이 끝나면 소멸된다.  
  2. 메소드 코드 , 상수 , 열거 상수는 정적(메소드) 영역에 생성된다. 
  3. 참조되지 않는 객체는 프로그램에서 직접 소멸 코드를 작성하는 것이 좋다. X
  4. 배열 및 객체는 힙 영역에 생성된다.

3. String 타입에 대한 설명으로 틀린 것은 무엇입니까?

  1. String은 클래스이므로 참조 타입이다.
  2. String 타입의 문자열 비교는 == 를 사용해야 한다.   O
  3. 동일한 문자열 리터럴을 저장하는 변수는 동일한 String 객체를 참조한다
  4. new String ("문자열")은 문자열이 동일하더라도 다른 String 객체를 생성한다.

4. 배열을 생성하는 방법으로 틀린 것은 무엇입니까?

  1. int[]array = {1,2,3};
  2. int[]array; araay = {1,2,3};   
  3. int[]array = new int[3];  
  4. int[][]array = new int[3][2];

5. 배열의 기본 초기값에 대한 설명으로 틀린 것은 무엇입니까?

  1. 정수 타입 배열 항목의 기본 초기값은 0 이다.
  2. 실수 타입 배열 항목의 기본 초기값은 0.0f 또는 0.0 이다. 
  3. boolean 타입 배열 항목의 기본 초기값은 true 이다. o
  4. 참조 타입 배열 항목의 기본 초기값은 null 이다.

6. 배열의 길이에 대한 문제입니다. array.length 의 값과 array[2].length 의 값은 얼마입니까?

int[][] array = {

{95,86},

{83,92,96},

{78,83,93,87,88}

};

array.length ->    3

array[2].length ->  5


6장-클래스.pdf
0.53MB

클래

 

객체지향언어

특징 :

      코드재사용성높음 

      코드의관리가용이(유지보수 용이)

 


클래스 ( 사용자 정의 자료형)

 

추상화 - 클래스생성과정

명사 필드
기능 메서드

 

 

상속 - 재사용 (extends)

 

 

캡슐화 - 접근제어자

public (모든곳에서접근가능)

defalut  (같은 패키지 내에서만 접근)

protected( 같은패키지내에서만 접근

(상속관계인경우에는 다른패키지가능))

, private : 같은클래스만 접근 가능

 

다형성 : 참조 변수의 형변환

 


클래스의 구조와 정의


실행

 

java phoneEx1

 

1) JVM환경설정

2) 힙영역에 p1 객체생성

3) p1객체가 color ,power , no 등의 정보를가짐

p1(주소 x001)

color
(검정)
power
(t)
no
(010-xxx)
메서드
(power,send , recevice)

 

4)p2 객체도 동일하게 힙영역에서 생성

p2 (주소x002)

color
(파랑)
power
(true)
no
(010-xx)
메서드
(power,send , recevice)

 

package chap06;
/*
 * 클래스 예제
 * 
 * 클래스 : 사용자정의자료형
 * 속성 ㅣ 멤버변수 , 필드
 * 기능 : 멤버 메서드 , 멤버함수
 */
class phone {
	String color; //색상, 멤버변수 , 필드
	boolean power;//전원
	String no; //번호

	//멤버 메서드
void power() {//전원켜기
	power = !power;
}

void send(String no) {
	System.out.println(no+"로 전화거는중");
}
void recevie(String no) {
	System.out.println(no+"에서 전화받는 중");
}

}

//구동클래스 : main메서드를 포함한 public클래스
public class PhoneEx1 {
	public static void main(String[] args) {
		phone p1 = new phone(); 
		//객체화(인스턴스화)--> 메모리할당.객체생성
        /*
		 * new : 객체화 기능
		 * 1. 힙영역에 메모리할당 (객체생성)
		 * 2.멤버변수(필드)를 기본값으로 초기화
		 * 3.생성자호출 
		 */
		
		p1.color = "검정";
		p1.power = true;
		p1.no = "010-1234-7892";
		System.out.println(p1.color+", "+p1.power+", "+p1.no);
		
		
		phone p2 = new phone();
		p2.color = "파랑";
		p2.power = true;
		p2.no = "010-4321-7792";
		System.out.println(p2.color+", "+p2.power+", "+p2.no);
		
		p1.send(p2.no);
		p2.recevie(p1.no);
        
        
		System.out.println("p1의 주소값을 p2가 사용");
		System.out.println("p2 = p1 ");
		p2=p1;
		System.out.println(p1.color+", "+p1.power+", "+p1.no);
		System.out.println(p2.color+", "+p2.power+", "+p2.no);
        
        System.out.println("p1.color change");
		p1.color = "빨강빨강";
        //p1의 객체의 필드가 변경되면
		//같은 객체주소를 참조하고있는 p2 도 바뀌게 됨.
		System.out.println(p1.color+", "+p1.power+", "+p1.no);
		System.out.println(p2.color+", "+p2.power+", "+p2.no);
		
	}
}
 

검정, true, 010-1234-7892

파랑, true, 010-4321-7792

 

010-4321-7792로 전화거는중

010-1234-7892에서 전화받는 중

 

p1의 주소값을 p2가 사용

p2 = p1

검정, true, 010-1234-7892

검정, true, 010-1234-7892

 

p1.color change

빨강빨강, true, 010-1234-7892

빨강빨강, true, 010-1234-7892

 

 


클래스 예제

 

public class Exam01 {
	public static void main(String[] args) {
		Rectangle r1 = new Rectangle();
		r1.width = 10;
		r1.height = 5;
		r1.area();// 사각형 면적 : 50
		r1.length(); //사각형둘레 300
	}
}

Rectangle 클래스를 완성하시오

(나중에 알겠지만 필드에 직접접근하는 건 좋지않음

필드는 private으로 접근을 막고 생성자를 통해 한번만 접근 하게 하자)

 

class Rectangle {

	int width;
	int height;
	public void area() {
		System.out.println("면적 : "+(width*height));
	}
	public void length() {
		System.out.println("둘레  : "+2*(width+height));
	}
}

 


오늘의 마무리 예제

 

test2.zip
0.00MB

 

문제는  이거를 다운해서 보면 된다

 

주요문제 딱 2개만풀어보겠다

 

/*
 command line에서 숫자로 이루어진 문자를 두개 받아서 두수의 공약수를 구하시오
 int num1 = Integer.parseInt(args[0])
   [결과]
   10과 20 의 공약수 : 1,2,5,10,

 */

 

클래스 실행 후

우클릭 +run + runConfiguration 을 누르면 이화면이나온다

package chap05.test2;

public class Test2 {

	public static void main(String[] args) {
		int int1 = Integer.parseInt(args[0]);
		
		
		int int2 = Integer.parseInt(args[1]);
		for (int i = 0; i < args.length; i++) {
			System.out.println("args["+i+"] : "+args[i]);
		}
		//args 입력 할떄 space를 누르지않는다면 배열의요소가 하나가됨 args.length == 1 
		//띄어쓰기로 요소를 분리해서 저장하자
	
	
		int i=0;
		System.out.println(int1+"와"+int2+"의 공약수  : ");
		while(true) {
			++i;
			if(int1%i==0 && int2%i==0) {
				System.out.print(i+",");
			}
			if(i>int1 || i>int2) {
				break;
			}	//i(반복수가) 둘중 하나의값이라도 넘으면 break;
			}
	}
}

args[0] : 10

args[1] : 20

10와20의 공약수 :

1,2,5,10,

 

주의점은 args는 스페이스바를 누르지않고 요소를 입력해버리면

args[0] 에 모든문자가 들어가버리므로

space바로 분리해서 2개의요소가 만들어지게끔 하자

 


문제2

package chap05.test2;

import java.util.Arrays;

public class Test3 {

	public static void main(String[] args) {
		int[][] score = {
				{90,80,70},
				{95,85,75},
				{70,80,75},
				{75,70,85},
				{70,75,80}
		}; 
		
		int[][] result = new int[score.length+1][score[0].length+1];
		int j=0;
		
		int a =  score.length;
		int b= score[0].length;
		for (int i = 0; i < a; i++) {
			
			for (j = 0; j < b; j++) {
				result[i][j] = score[i][j];
				result[i][score[i].length] += score[i][j];
				result[score.length][j] += score[i][j];
				
				
			}
			result[a][b] += result[i][b];
		}
		
		for (int[] is : result) {
			System.out.println(Arrays.toString(is));
		}System.out.println();
		
		
	}

}

[90, 80, 70, 240]

[95, 85, 75, 255]

[70, 80, 75, 225]

[75, 70, 85, 230]

[70, 75, 80, 225]

[400, 390, 385, 1175]

 

앞에서배웟던 Arrays.copyOf 등을 사용하려했지만

생각보다 어려워서

 

다음과같이 행 , 열이 1씩 큰 배열을 하나만들고 

다음과같이  원본 배열만큼의 이중for문을 만든 후

각 행을 그대로 result에 복사 함과 동시에

각 행의 모든합을 더해 result[i][score[i].length] 에 넣어주었고

 

 

각 열의 합도

result [ score.length] [ j ] +=  score [ i ] [ j ] 에 쌓아두었다

// result [ 5 ]  [0 ] += score [ 0 ] [0]      ....result[5][3] += score [ 0 ] [ 3 ] 

/  result [ 5 ]  [0 ] += score [ 1] [1]      ....result[5][3] += score [ 1 ] [ 3 ] 

으로 열의 합을 쌓는방식!!!!

 

마지막으로 result[score.length][score[0].length] 가 비어있을거다

여기에는  result [ i ] [ score[0].length] 를 채워주면 됨

 


문제3

package chap05.test2;

import java.util.Arrays;

public class Test5_1 {
	public static void main(String[] args) {
		int size=11;
		String[][] a =  new String[size][size];
		int b=0;
		int c=(a.length-1);
		
		//String 배열의 초기화는 필수임
		//초기화안할시 다 null값이므로 다른것을 찍을 수 없게됨
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[0].length; j++) {
				a[i][j] = " ";
			}
			
		}
		
		for (int i = 0; i <= a.length; i++) {
			for (int j = 0; j < a[0].length; j++) {
				if(j==b || j==c) {
					a[i][j] = "X";
				}
			}b++;c--;	
		}
		
		
		
		
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[0].length; j++) {
				System.out.print(a[i][j]+" ");
			}System.out.println();
			
		}
		
		
		

	}
}

 

 

여기서처음에 많이 헤맸다.

String 배열은 처음에 꼭 초기화를 해줘야한다.

아니면 다 null값으로 들어가서 빈칸이 나오지않는다

 

 

초기화 후

 

int b=0;
int c=(a.length-1);

for (int i = 0; i <= a.length/2; i++) {
			for (int j = 0; j < a[0].length; j++) {
				if(j==b || j==c) {
					a[i][j] = "X";
				}
			}b++;c--;	
		}

 

저  X표시의 법칙을 보니까 하나는 0부터 올라가고 두번째꺼는 10(length-1)부터 내려가면서 찍히는 방식이었다.

 

b++ c-- 를해 숫자증감 효과를 둠

b:  0 1 2 3 4 5   6 7  8  9  10

c: 10 9 8 7 6 5  4 3  2  1  0

 

int b=0;
int c=10;
for (int i = 0; i <= a.length; i++) {
			for (int j = 0; j < a[0].length; j++) {
				if(j==b || j==c) {
					a[i][j] = "X";
				}
			}b++;c--;	
		}

 

그 다음 length/2+1 부터 루프를 돌렸고

똑같은 방식이지만

b++ ,c-- 로변경

 

이러게 한 후

중첩for문으로 각 요소들을 모두 뽑아봄

 

 


 

이문제도있는데 이거는 위에 설명을 잘 들었으면 바로 이해할거라서

대충 설명 하겠다

 

package chap05.test2;

public class Test6 {
	public static void main(String[] args) {
		int size=11;
		String[][] a =  new String[size][size];


		//String 배열의 초기화는 필수임
		//초기화안할시 다 null값이므로 다른것을 찍을 수 없게됨
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[0].length; j++) {
				if(i%2==0&&j%2==0) {
					a[i][j] = "□";	
				}
				else {
					a[i][j] = "■";
				}

			}
		}

		for (int i = 0; i < a.length; i++) {
			a[i][i] = "X";
			a[i][a.length-1-i] = "X";
		}



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

		}
	}
}

 

 

위에 꺼와 바뀐 X 표시 찍는방법

for (int i = 0; i < a.length; i++) {
a[i][i] = "X";
a[i][a.length-1-i] = "X";
}

 

이 x 표를 찍는 방법이 바뀌었는데

위에 처럼하거나

이렇게 해도 같은 방법이다.

a[0][0]  a[0][10]  

a[1][1] a[1][9] ......

a[8][8] a[8][2]

a[9][9] a[9][1]

a[10][10] a[10][0]

에 X 가찍히는 것

 


https://github.com/donggonyoo/javaStudyGudee/tree/main/chap05/src/chap05/test2

 

javaStudyGudee/chap05/src/chap05/test2 at main · donggonyoo/javaStudyGudee

Contribute to donggonyoo/javaStudyGudee development by creating an account on GitHub.

github.com

 

내풀이는 여기 있다!