프로그래밍공부노트

Day 27 - Java(예외 처리 정리, 마방진) 본문

JAVA

Day 27 - Java(예외 처리 정리, 마방진)

SANGJIN-YU 2021. 3. 19. 19:05
반응형

Error Exception validation 모두 예측하지 못해서 발생

 

 - Error는 처리할 수 없다

 - Exception 처리한다 (Exception class 통해 제어) / 문제점 예측 -> 시스템이 멈추지 않도록처리하는 것 (해결이 아님) 

 - checked Exception (위임을 하는 코드를 작성 throws) 예측을 필수로 해야되 자주 발생하니까 

 - 예외처리는 객체가 생성됐을 때가 아닌 사용됐을 때

 - validation 값의 처리 연산 : 1~9 사이의 값이 입력되야 합니다. 1<= n <= 9 유효값

 

try{
	연산
    }catch(예외처리 클래스1 e1){
    e.printStackTrace();
    }catch(예외처리 클래스2 e2){
    
    

e1과 e2는 동등 계층이거나 

e1의 계층이 높다면 e2의 계층은 사용되지 않습니다. 따라서 이러한 경우 Unreachable code 발생

 

e1 - > Exception

e2 - > NullPointException  // NullPointException 도착하지 않음

 

e1 -> throwable

e2 -> exception // exception 도착하지 않음


multi ~ catch

try{
	연산
    }catch(예외처리 클래스1 | 예외처리 클래스2 | 예외처리 클래스 3 e){
    e.printStackTrace();
    }
    

반드시 상위 혹은 하위로 구성된 계층구조의 예외가 아니라 동등 구조일 때 사용 가능

예외처리 클래스1이 NullpointException이고 예외처리 클래스2가 Exception이라면 어차피 Exception에서 모든 것을 처리하기 때문에 사용이 불가능

 

 


62. 마방진(Magic Square)

 - 특정한 수의 가로 * 세로의 이차원 배열에 1부터 n*n의 수만큼 값을 입력한다

 - 이렇게 입력된 2차원 배열은 가로 세로 대각선 역대각선의 합이 모두 같게 되어야 한다.

 - 홀수 마방진(3,5,7,9) 

 - 짝수 마방진(4,8,12)

 - 기타 마방진(나누면 홀수가 되는 마방진이 되는 수(6, 10, 14)

 

홀수마방진 

 1) 배열의 첫번째 row의 중간(0,2)에 1을 입력한다

 2) 현재의 (x,y)의 좌표를 -1씩 처리한다. (0,2) -> (-1,1)

 3) 만약에 이동한 좌표가 음수가 나온다면 배열의 최대 값으로 변경한다 (-1,1) -> (4,1)

 4) 2번과 3번의 조건이 맞다면 다음 값을 입력해준다 (4,1)에 1다음 값인 2를 입력

 5) 만약 이동한 곳의 위치에 값이 입력되어 있다면 이동전의 (x,y)에 (x+1,y)로 처리

 

 

 6) (4,1) -> -1처리하여 (3,0) -> (3,0)에 2다음 값인 3을 입력

 7) (3,0) -> -1처리하여 (2,-1) -> (2,4)에 3다음 값인 4를 입력

 8) (2,4) -> -1처리하여  (1,3) -> (1,3)에 4 다음 값인 5를 입력

 9) (1,3) -> -1처리하여 (0,2) -> (0,2)에 5다음 값인 6을 입력....쭉쭉 진행 

 

package com.min.edu.square;

/**
 * 3부터 홀수에 대한 마방진을 구성하는 class
 * @author SANGJINYU
 * @since 2021.03.19
 */

public class OddMagicSquare {

	private int[][] square;
	
	public OddMagicSquare(int n) {
		square = new int[n][n];
	}
	
	/**
	 * 마방진 연산을 처리하는 메소드<br>
	 * <p>
	 * x와 y의 좌표를 -1씩 이동시키고 만약 이동시킨 위치의 값이 존재 한다면 변경 전 위치의 값에 x+1, y로 처리한다
	 * </p>
	 */
	public void make() {
		int len = square[0].length;
		int x = 0;
		int y = len/2;
		
		square[x][y] = 1;
		
		for (int i = 2; i <= len*len; i++) {
			int tmpX =x;
			int tmpY = y;
			
			
			// x와y를 변경하는 로직이 들어감
			if ((x-1) < 0) {
				x = len -1;
			} else {
				x --;
			}
			
			if ((y-1) < 0) {
				y = len -1;
			} else {
				y--;
			}
			
			if (square[x][y] != 0) {
				x = tmpX+1;
				y = tmpY;
			}
			//변경 로직 끝
			
			square[x][y] = i;
		}
	}
	/**
	 * 외부에서 생성된 마방진을 가져갈 수 있도록 함(은닉화 Encapsulation)
	 * @return 완성된 2차원 배열
	 */
	public int[][] getSquare() {
		return square;
	}
}

 1) 배열의 첫번째 row의 중간(0,2)에 1을 입력한다

    - len은 첫번째 row의 길이,  x = 0;, y= len/2;(첫번째 row의 중간에 들어가야하기 때문에 길이를 2로 나눈 몫을 사용하면 가운데 들어감)

    - square[x][y]에 초기값인 1을 대입

 2) 반복 횟수는 (특정한 수의 가로 * 세로의 이차원 배열에 1부터 n*n의 수만큼 값을 입력한다)라는 조건에 따라서

    - 3 x 3, 5 x 5 등 길이 x 길이이기 때문에 len x len까지 반복되도록 작성, 1은 이미 처리했기 때문에 2부터 반복

 3) 만약 이동한 곳의 위치에 값이 입력되어 있다면 이동전의 (x,y)에 (x+1,y)로 처리하기 위하여 

    - tempX와 tempY를 먼저 선언하여 이동전의 값에 대한 처리 가능하도록 한다

 4) 현재의 (x,y)의 좌표를 -1씩 즉(x-1) (y-1) 처리한다.

    - 만약에 이동한 좌표 (x-1) (y-1) 가 음수가 나온다면 배열의 최대 값으로 변경한다는 로직 작성, x-1 < 0과 y-1 <0 이 조건에서는 최대 값으로 변경 최대값은 여기서 index로 나타내기 때문에 len-1의 값이 최대값이다. 그 외의 정상적인 로직은 x--; y--;를 통하여 (x-1) (y-1) 처리

  5) 만약 이동한 곳의 위치에 값이 입력되어 있다면 이동전의 (x,y)에 (x+1,y)로 처리하기 위하여 square[x][y]가 != 0(0이 아니라면 값이 있는 것이기 때문에)의 조건을 만족시키면 (tempX+1,tempY)값을 대입하여 위치를 지정하고 0이라면 그냥 (x,y)를 위치로 지정하고 그 위치에 들어가야할 i 값을 대입 

 

 

 

62. 마방진(Magic Square) - 검수 로직(검수하는 프로그램 만들어보자)

6 1 8
7 5 3
2 9 4

가로 세로 대각선 역대각선의 합이 같다

 

a = { [0] {a[0],b[1],c[2]}, [1] {d[0],e[1],f[2]}, [2] {g[0],h[1],i[2]} };

 

 

우선 가로 세로 대각선 역대각선의 합이 같은지 확인하는 print()로 찍어보자

 

내가 했던 방법

public void print() {
		
		for (int i = 0; i < square.length; i++) {//row의 번호
			int sum = 0;
			for (int j = 0; j < square.length; j++) {//col의 번호
				System.out.print(square[i][j]+"\t");
				sum += square[i][j];// x를 기준으로 합을 구함
				}
			System.out.println(sum); // row합 출력
			System.out.println();
		}
		
		for (int i = 0; i < square.length; i++) {
			int sum = 0;
			for (int j = 0; j < square.length; j++) { 
				sum += square[j][i]; // y를 기준으로 합을 구함
				}
			System.out.print(sum +"\t"); //col 기준으로 합 출력
		}
		
		int sum = 0;
		for (int i= 0; i < square.length; i++) {
			sum += square[i][i]; // 0,0 1,1 2,2 니까 i하나로 합을 구함 
		}
		System.out.println(sum);
	}
  

 

선생님이 만든 방법은 합이 만들어지는 기준에 따라서 행의 합을 구하는 메소드, 열의 합을 구하는 메소드, 대각선의 합을 구하는 메소드, 역대각선의 합을 구하는 메소드 4개 분리하여 만들어서 for문 태워서 출력

반응형

'JAVA' 카테고리의 다른 글

Day 30 - Java(짝수 4마방진, 기타 10마방진 )  (1) 2021.03.24
Day 29 - Java(짝수 마방진)  (0) 2021.03.23
Day 26 - Java(Cloneable)  (0) 2021.03.18
Day 24 - JAVA(야구게임)  (0) 2021.03.16
Day 21 - JAVA(JCF, Set, List, Map)  (0) 2021.03.11