일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 참조타입
- 개선
- scope
- 알고리즘
- extends
- for문
- jdbc
- java
- 형변환
- regex
- 자료구조
- Set
- jar
- 정규화표현식
- 환경설정
- String
- jsp
- Selector
- DB
- SQL
- mybatis
- JavaScript
- html
- interface
- JCF
- 자바
- iBATIS
- 자바스크립트
- controller
- jquery
- Today
- Total
프로그래밍공부노트
Day 29 - Java(짝수 마방진) 본문
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]}};
모든 마방진은 가로n개 세로 n개 대각선 1개, 역대각선 1개로 구성되어 있다.
2*n+2개가 검수해야 할 대상의 개수이다.
모든 검수 대상은 배열에 담아서 같은 값이라면 마방진이 성공했다라 판단한다.
62. 짝수 마방진(Magic Square) -1
- 짝수 마방진(4,8,12)
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
- 1차원의 값을 2차원의 값으로 변경
1차원 : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2차원
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
(x,y)
(0,0) 0 (0,1) 1 (0,2) 2 (0,3) 3 (4*x+y) 4로나눈 몫 , 4로나눈 나머지
(1,0) 4 (1,1) 5 (1,2) 6 (1,3) 7 (4*x+y)
(2,0) 8 (2,1) 9 (2,2)10 (2,3) 11 (4*x+y)
첫번째 로직 : 1차원을 2차원 값으로 변경 (값/n,값%n) = 값+1
1차원을 2차원으로 바꾸는 방법
0 [0/4,0%4] = (0,0) 0+1;
1 [1/4,1%4] = (0,1) 1+1;
2 [2/4,2%4] = (0,2) 2+1;
3 [3/4,3%4] = (0,3) 3+1;
4 [4/4,4%4] = (1,0) 4+1;
5 [5/4,5%4] = (1,1) 5+1;
6 7 8 9 10 11 12 13 14 15
두번째 로직 : 2차원을 1차원 값으로 변경
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
1 | 15 | 14 | 4 |
12 | 6 | 7 | 9 |
8 | 10 | 11 | 5 |
13 | 3 | 2 | 16 |
4x4에서 배열이 커지더라도 일반항은 같다(값이 변하는 부분이 포함되는 곳을 일반항으로) 1/4로 같다.
1) 연산이 되어야 할 영역의 범위를 잡는다.
2) for(int i = 0; i <square.length; i++){ // 행
for(int j =0; j<square.length; j++){// 열
if(i >= 0 && i<n/4 || i>= n/4*3 && i <n){
if( j >= n/4 && j < n/4*3){
square[i][j] = square.length * square.length -(i*square.length + j)
} else if(j >= 0 && j<n/4 || j>= n/4*3 && j <n){
square[i][j] = square.length * square.length -(i*square.length + j)
}
}
}
public void make(int n) {
for (int i = 0; i < square.length; i++) {
for (int j = 0; j < square.length; j++) {
square[i][j] = (n*i+j+1);
}
}
private void makeA() {
int len = square.length;
for (int i = 0; i < len*len; i++) { // 15까지 입력을 해야한다 여기 +1하면 16
square[i/len][i%len] = i+1;
}
}
아래의 짝수 마방진 준비 코드
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
'JAVA' 카테고리의 다른 글
Day 50, 51 - IO(InputStream, OutputStream) (0) | 2021.04.26 |
---|---|
Day 30 - Java(짝수 4마방진, 기타 10마방진 ) (1) | 2021.03.24 |
Day 27 - Java(예외 처리 정리, 마방진) (0) | 2021.03.19 |
Day 26 - Java(Cloneable) (0) | 2021.03.18 |
Day 24 - JAVA(야구게임) (0) | 2021.03.16 |