[자바JAVA]1097 : [기초-2차원배열] 바둑알 십자 뒤집기(설명)

문제 1097 : [기초-2차원배열] 바둑알 십자 뒤집기(설명)

부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가…
“십(+)자 뒤집기를 해볼까?”하고 생각했다.
바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.

  • 입력예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
2
10 10
12 12
  • 출력예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0




코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.util.Scanner;

public class c1097 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] arr = new int[19][19]; //2차원배열생성

//입력값 배열에 넣기
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr.length; j++){
arr[i][j] = sc.nextInt();
//System.out.printf("%d ",arr[i][j]);
}
//System.out.println();
}

int count = sc.nextInt(); // 십자 뒤집기 횟수(n)

//1이면 0으로 0이면 1로
for(int n=0; n<count; n++){
int x = sc.nextInt()-1; //10 12
int y = sc.nextInt()-1; //10 12

//[10, i]가 0이면 1로, 1이면 0으로
for(int i=0; i<arr.length; i++){
if(arr[x][i] == 0){
arr[x][i] = 1;
}else{
arr[x][i] = 0;
}
}

//[j, 12]가 0이면 1로, 1이면 0으로
for(int j=0; j<arr.length; j++){
if(arr[j][y] == 0){
arr[j][y] = 1;
}else{
arr[j][y] = 0;
}
}
}
sc.close();

//답 출력
for(int i=0; i<arr.length; i++){
for(int j=0; j<arr.length; j++){
System.out.printf("%d ", arr[i][j]);
}
System.out.println();
}

}//end of main
}




배운지식

십자뒤집기가 이해되지않아 한참 규칙을 찾기위해 애썼다.
주어진 좌표(10,12)이면 [10, n]가 0이면 1로, 1이면 0으로 뒤집고 [n, 12]가 0이면 1로, 1이면 0으로 뒤집는다는 뜻이었다.
이제 제대로 이해했으니 다신 헷갈리지말자.




다른 문제 풀이가 보고싶다면?