2022년 7월 7일에 작성됨
https://www.codeup.kr/problem.php?id=1097
[기초-2차원배열] 바둑알 십자 뒤집기(설명)
C언어기초100제v1.2 : @컴퓨터과학사랑, 전국 정보(컴퓨터)교사 커뮤니티/연구회 - 학교 정보(컴퓨터)선생님들과 함께 수업/방과후학습/동아리활동 등을 통해 재미있게 배워보세요. - 모든 내용
www.codeup.kr
문제 분석
- (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("%d", &arr[i][j]);
}
}
scanf("%d", &n); // 십자 뒤집기 횟수(n) 입력
for (i = 1; i <= n; i++) { // n 횟수 만큼 반복
scanf("%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으로 초기화
2. 뒤집기 할 횟수 n과 뒤집기 할 좌표(x , y) 입력
3. 가로, 세로 흑(0), 백(1) 바꾸기 (if 0이면 1로, else 1이면 0으로)
4. 뒤집기 한 바둑판의 결과 출력
end
십자 뒤집기가 뭔지 몰라서 어려운 문제겠거니 했는데 생각보다 쉬운 문제였다. 코드 전체로 보면 엄청 어려워 보이는데 하나하나 보면 2차원 배열 기초만 알아도 이해가 잘 된다.
'코딩테스트 & 문제 풀이' 카테고리의 다른 글
[C]코드업_1099 : [기초-2차원배열] 성실한 개미 (2) | 2023.05.01 |
---|---|
[C]코드업_1098 : [기초-2차원배열] 설탕과자 뽑기 (0) | 2023.04.30 |
[C]코드업_1096 : [기초-2차원배열] 바둑판에 흰 돌 놓기 (0) | 2023.04.29 |
[C]백준_2292 : 벌집 (0) | 2023.04.28 |
[C]백준_10250 : ACM 호텔 (0) | 2023.04.27 |
2022년 7월 7일에 작성됨
https://www.codeup.kr/problem.php?id=1097
[기초-2차원배열] 바둑알 십자 뒤집기(설명)
C언어기초100제v1.2 : @컴퓨터과학사랑, 전국 정보(컴퓨터)교사 커뮤니티/연구회 - 학교 정보(컴퓨터)선생님들과 함께 수업/방과후학습/동아리활동 등을 통해 재미있게 배워보세요. - 모든 내용
www.codeup.kr
문제 분석
- (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("%d", &arr[i][j]);
}
}
scanf("%d", &n); // 십자 뒤집기 횟수(n) 입력
for (i = 1; i <= n; i++) { // n 횟수 만큼 반복
scanf("%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으로 초기화
2. 뒤집기 할 횟수 n과 뒤집기 할 좌표(x , y) 입력
3. 가로, 세로 흑(0), 백(1) 바꾸기 (if 0이면 1로, else 1이면 0으로)
4. 뒤집기 한 바둑판의 결과 출력
end
십자 뒤집기가 뭔지 몰라서 어려운 문제겠거니 했는데 생각보다 쉬운 문제였다. 코드 전체로 보면 엄청 어려워 보이는데 하나하나 보면 2차원 배열 기초만 알아도 이해가 잘 된다.
'코딩테스트 & 문제 풀이' 카테고리의 다른 글
[C]코드업_1099 : [기초-2차원배열] 성실한 개미 (2) | 2023.05.01 |
---|---|
[C]코드업_1098 : [기초-2차원배열] 설탕과자 뽑기 (0) | 2023.04.30 |
[C]코드업_1096 : [기초-2차원배열] 바둑판에 흰 돌 놓기 (0) | 2023.04.29 |
[C]백준_2292 : 벌집 (0) | 2023.04.28 |
[C]백준_10250 : ACM 호텔 (0) | 2023.04.27 |