[C]코드업_1097 : [기초-2차원배열] 바둑알 십자 뒤집기

Alal11·2022년 7월 7일
1
post-thumbnail

출처

https://www.codeup.kr/problem.php?id=1097


문제

부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가...

"십(+)자 뒤집기를 해볼까?"하고 생각했다.

바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.

참고

가로 번호, 세로 번호를 사용할 수 있는 2차원 배열을 사용하면
이러한 형태를 쉽게 기록하고 사용할 수 있다. 물론 더 확장한 n차원 배열도 만들 수 있다.

<예시>

int n, i, j, x, y;
int a[20][20]={};
for(i=1; i<=19; i++) //한 줄씩 바둑판 상황 입력 받기
for(j=1; j<=19; j++)
scanf("%d", &a[i][j]);

scanf("%d", &n); //좌표 개수 입력받기

for(i=1; i<=n; i++) //좌표의 개수만큼
{
scanf("%d %d", &x, &y);
for(j=1; j<=19; j++) //가로 줄 흑<->백 바꾸기
{
if(a[x][j]==0) a[x][j]=1;
else a[x][j] = 0;
}
for(j=1; j<=19; j++) //세로 줄 흑<->백 바꾸기
{
if(a[j][y]==0) a[j][y]=1;
else a[j][y] = 0;
}
}
...


입력

바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다.
십자 뒤집기 횟수(n)가 입력된다.
십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다.


출력

십자 뒤집기 결과를 출력한다.


➡️문제 분석

  • (19 x 19) 크기로 깔려 있는 바둑판 상황을 0 (검은 돌) 또는 1 (흰 돌)로 입력한다.
  • n번의 십자 뒤집기 할 횟수와 십자 뒤집기를 할 좌표 (x , y)를 입력한다.
  • (x , y) 좌표를 기준으로 십자 모양(+)에 있는 바둑돌이 0이면 1로, 1이면 0으로 바꿔준다. (단, 입력된 좌표는 뒤집기에서 제외한다.)
  • n번 만큼 바꿔준 후 (19 x 19) 크기의 바둑판 결과를 출력한다.

예를 들어 (7 x 7) 모양의 바둑판에서 n=2이고, 좌표는 (3 , 3), (5 , 5)이라고 하자.
먼저 (3 , 3)을 십자 뒤집기를 하면 아래 사진처럼 된다.
(3 , 3)을 제외하고 그 중심으로 십자 모양의 바둑돌을 1->0, 0->1으로 바꿔준 결과이다.
그 다음 (5 , 5)도 십자 뒤집기를 하면 아래 사진처럼 결과가 나온다.


➡️코드(⭕)

#include <stdio.h>
int main()
{
	int n, i, j, x, y;
	int arr[20][20] = { 0, };

	for (i = 1; i <= 19; i++) {		// 한 줄씩 바둑판 상황 입력
		for (j = 1; j <= 19; j++) {
			scanf_s("%d", &arr[i][j]);
		}
	}
	scanf_s("%d", &n);		// 십자 뒤집기 횟수(n) 입력

	for (i = 1; i <= n; i++) {		// n 횟수 만큼 반복
		scanf_s("%d %d", &x, &y);		// 십자 뒤집기 할 좌표 입력

		for (j = 1; j <= 19; j++) {		// 가로 줄 (흑<->백) 바꾸기
			if (arr[x][j] == 0) arr[x][j] = 1;
			else arr[x][j] = 0;
		}
		for (j = 1; j <= 19; j++) {		// 세로 줄 (흑<->백) 바꾸기
			if (arr[j][y] == 0) arr[j][y] = 1;
			else arr[j][y] = 0;
		}
	}
	for (i = 1; i <= 19; i++) {		// 바둑판 결과 출력
		for (j = 1; j <= 19; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

<코드 분석>

  1. 바둑판이 (19 x 19) 크기이므로 배열은 arr[20][20]으로 선언하고 0으로 초기화
  1. 뒤집기 할 횟수 n과 뒤집기 할 좌표(x , y) 입력

  2. 가로, 세로 흑(0), 백(1) 바꾸기 (if 0이면 1로, else 1이면 0으로)

  3. 뒤집기 한 바둑판의 결과 출력


➡️end

  • 십자 뒤집기가 뭔지 몰라서 어려운 문제겠거니 했는데 생각보다 쉬운 문제였다. 코드 전체로 보면 엄청 어려워 보이는데 하나하나 보면 2차원 배열 기초만 알아도 이해가 잘 된다.
  • 예시로 그림 설명할 때 마우스로 그린거라 보기가 좋지않다.. 깔끔하고 보기좋게 좀 편하게 할 수 있는 방법은 없나??

0개의 댓글