이 구간은 프로그래밍 기초의 꽃이라 불리는 2차원 배열과 시뮬레이션을 다룹니다. 격자판 위에서 데이터를 조작하고, 물체를 이동시키는 로직을 구현하며 알고리즘적 사고력을 완성하는 단계입니다.
바둑판(19 * 19)에 흰 돌(1) 또는 검은 돌(0)이 모두 꽉 채워져 놓여있다. n개의 좌표를 입력받아 그 좌표에 있는 돌을 중심으로 가로 줄과 세로 줄의 색을 모두 뒤집는 프로그램을 작성해보자.
십자 뒤집기 결과를 출력한다. (각 줄의 숫자는 공백으로 구분)
#include <stdio.h>
int main() {
int board[20][20]; // 1~19 인덱스를 사용하기 위해 20x20 선언
int n, i, j, x, y;
// 1. 현재 바둑판 상태 입력 받기 (19x19)
for(i = 1; i <= 19; i++) {
for(j = 1; j <= 19; j++) {
scanf("%d", &board[i][j]);
}
}
// 2. 뒤집기 횟수 입력
scanf("%d", &n);
// 3. 횟수만큼 좌표를 입력받아 뒤집기 실행
for(i = 1; i <= n; i++) {
scanf("%d %d", &x, &y);
// 십자 뒤집기 로직
for(j = 1; j <= 19; j++) {
// 가로 줄(x행) 뒤집기: 0이면 1, 1이면 0
if(board[x][j] == 0) board[x][j] = 1;
else board[x][j] = 0;
// 세로 줄(y열) 뒤집기: 0이면 1, 1이면 0
if(board[j][y] == 0) board[j][y] = 1;
else board[j][y] = 0;
}
}
// 4. 최종 결과 출력
for(i = 1; i <= 19; i++) {
for(j = 1; j <= 19; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
return 0;
}
(복사하여 테스트하세요. 19줄의 바둑판 상태, 횟수 1, 좌표 10 10 입니다.)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 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
10 10
(10행과 10열이 뒤집힌 상태)
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 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 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
부모님과 함께 놀러간 영일이는 설탕과자(설탕을 녹여 물고기 등의 모양을 만든 것) 뽑기를 보게 되었다. 길이가 다른 막대 여러 개를 격자판에 놓는데, 격자판의 세로(h), 가로(w), 막대의 개수(n), 각 막대의 길이(l), 방향(d), 좌표(x, y)를 입력받아 막대를 놓는 프로그램을 작성해 보자.
막대가 놓인 후의 격자판의 상태를 출력한다.
#include <stdio.h>
int main() {
int h, w, n, l, d, x, y;
int board[101][101] = {0}; // 격자판 최대 크기가 100이므로 101로 넉넉히 초기화
int i, j;
// 1. 격자판 크기 및 막대 개수 입력
scanf("%d %d", &h, &w);
scanf("%d", &n);
// 2. 막대 정보 입력 및 배치
for(i = 1; i <= n; i++) {
scanf("%d %d %d %d", &l, &d, &x, &y);
for(j = 0; j < l; j++) { // 막대 길이(l)만큼 반복
if(d == 0) {
// 가로 방향(d=0): 행(x)은 고정, 열(y)이 증가
board[x][y + j] = 1;
}
else {
// 세로 방향(d=1): 열(y)은 고정, 행(x)이 증가
board[x + j][y] = 1;
}
}
}
// 3. 결과 출력
for(i = 1; i <= h; i++) {
for(j = 1; j <= w; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
return 0;
}
5 5
3
2 0 1 1
3 1 2 3
4 1 2 5
1 1 0 0 0
0 0 1 0 1
0 0 1 0 1
0 0 1 0 1
0 0 0 0 1
개미는 오른쪽(→) 또는 아래쪽(↓)으로만 움직일 수 있다. 미로 상자(10 * 10)에 개미(좌표 2, 2에서 시작)가 이동한 경로를 9로 표시하여 출력해보자.
10 * 10 크기의 미로 상자 구조가 입력된다.
개미가 이동한 경로를 9로 표시해 출력한다.
#include <stdio.h>
int main() {
int map[11][11]; // 10x10 미로
int i, j;
int x = 2, y = 2; // 개미의 시작 좌표는 (2, 2)로 고정됨
// 1. 미로 정보 입력
for(i = 1; i <= 10; i++) {
for(j = 1; j <= 10; j++) {
scanf("%d", &map[i][j]);
}
}
// 2. 개미 이동 시뮬레이션 (무한 루프)
while(1) {
// 경우 1: 현재 위치가 먹이(2)인 경우
if(map[x][y] == 2) {
map[x][y] = 9; // 먹은 자리를 표시하고
break; // 종료
}
map[x][y] = 9; // 현재 위치를 9(방문함)로 변경
// 경우 2: 오른쪽 이동 가능 여부 확인
if(map[x][y + 1] != 1) { // 오른쪽이 벽(1)이 아니라면 (0이거나 2)
y++; // 오른쪽으로 한 칸 이동 (열 증가)
}
// 경우 3: 오른쪽은 막혔고, 아래쪽 이동 가능 여부 확인
else if(map[x + 1][y] != 1) { // 아래쪽이 벽(1)이 아니라면
x++; // 아래쪽으로 한 칸 이동 (행 증가)
}
// 경우 4: 오른쪽, 아래쪽 모두 막힌 경우
else {
break; // 더 이상 갈 곳이 없으므로 종료
}
}
// 3. 최종 미로 상태 출력
for(i = 1; i <= 10; i++) {
for(j = 1; j <= 10; j++) {
printf("%d ", map[i][j]);
}
printf("\n");
}
return 0;
}
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 0 0 1
1 0 0 1 1 1 0 0 1 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 1 0 1 0 1
1 0 0 0 0 1 2 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 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 1 1
1 9 9 1 0 0 0 0 0 1
1 0 9 1 1 1 0 0 1 1
1 0 9 9 9 9 9 1 0 1
1 0 0 0 0 0 9 1 0 1
1 0 0 0 0 1 9 1 0 1
1 0 0 0 0 1 9 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
| [CodeUp] C언어 기초 100제 풀이 (1093번 ~ 1096번) (0) | 2026.02.04 |
|---|---|
| [CodeUp] C언어 기초 100제 풀이 (1089번 ~ 1092번) (0) | 2026.02.04 |
| [CodeUp] C언어 기초 100제 풀이 (1085번 ~ 1088번) (0) | 2026.02.04 |
| [CodeUp] C언어 기초 100제 풀이 (1081번 ~ 1084번) (0) | 2026.02.03 |
| [CodeUp] C언어 기초 100제 풀이 (1076번 ~ 1080번) (0) | 2026.02.03 |