1096 : [기초 - 2차원 배열] 바둑판에 흰 돌 놓기
문제 설명 : https://codeup.kr/problem.php?id=1096
흰 돌이 올려진 바둑판의 상황을 출력하는 문제다.
- 2차원 배열을 배운다
2차원 배열의 선언
타입 변수 이름 [ ][ ] = { };
2차원 배열은 테이블 형태의 데이터를 담는 데 사용된다.
3열 | |||
4행 | 0 | 0 | 0 |
0 | 0 | 0 | |
0 | 0 | 0 | |
0 | 0 | 0 |
int x[4][3] = { 0 };을 수행한 배열은 이렇게 나온다.
#include <stdio.h>
int main()
{
int i, j, x, y, input = 0;
int a[20][20] = { 0 }; // 2차원 배열 20행(0 ~ 19) 20열(0 ~19)을 만든다.
scanf("%d", &input); // 몇 개를 놓을지 입력 받음
for(i = 1; i <= input; i++) // input개만큼 놓음
{
scanf("%d %d", &x, &y); // 2차원 배열은 좌표 형태로 표현 가능
a[x][y] = 1; // 흰 돌이 있는 위치는 1, 없는 위치는 0
}
for(i = 1; i <= 19; i++) // 2차원 배열을 출력하기 위해서는 중첩 for문을 사용함
{
for(j = 1; j <= 19; j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
/* 1081에 중첩 for문에서 말했던 첫 번째 for문이 고정된다는 것을 알고 있으면 2차원 배열이
어떻게 출력되는지 어떻게 저장되는지를 쉽게 이해할 수 있다.*/
1097 : [기초 - 2차원 배열] 바둑알 십자 뒤집기
문제 설명 : https://codeup.kr/problem.php?id=1097
바둑알을 십자로 뒤집는 문제다.
#include <stdio.h>
int main()
{
int i, j, x, y, input = 0;
int a[20][20] = { 0 }; // 20행(0~19) 20열(0~19) 배열을 선언
for(i = 1; i <= 19; i++) // 한 줄씩 바둑판 상황 입력 받음
for(j = 1; j <= 19; j++)
{
scanf("%d", &a[i][j]);
}
scanf("%d", &input); // 좌표 개수 입력 받음
for(i = 1; i <= input; 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;
}
for(i = 1; i <= 19; i++) // 바뀐 바둑판 출력
{
for(j = 1; j <= 19; j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
1098 : [기초 - 2차원 배열] 설탕과자 뽑기
문제 설명 : https://codeup.kr/problem.php?id=1098
설탕과자 뽑기를 코드로 바꾸는 문제다.
이 문제는 한 번에 이해하기가 정말 어렵다. 본인은 많은 구글링과 지인들에게 물어본 후 이해할 수 있었다.
어렵게 이해한 만큼 주석이 하나하나 자세히 적었다.
1081에서 중첩 for문이 고정된다는 의미를 여기서 완벽하게 파악하였다.
#include <stdio.h>
int main()
{
int h, w, n, l, i , j , d, x, y;
// h = 세로, w = 가로, n = 막대 개수, l = 막대 길이, d = 0 가로, 1 세로, x , y = 좌표
int a[101][101] = { 0 };
scanf("%d %d", &h, &w); // 판의 넓이
scanf("%d", &n); // 막대 개수
for(i = 1; i <= n; i++) // 막대 개수만큼
{
scanf("%d %d %d %d", &l, &d, &x, &y);
if(l==1) // 막대 길이가 1일 때
{
if(a[x][y]==0) // x, y 좌표가 0이면
a[x][y] = 1; // x, y 좌표의 값을 1로 바꿈
}
if(l!=1) // 막대 길이가 1이 아닐 때
{
if(d == 0) // 가로로 놨을 때
{
for(j = 1; j <= l; j++)
a[x][y + j - 1] = 1; // 세로(행) 고정후 가로(열)를 바꿈
} // 특히 이 부분 왜 -1을 하는지에 대해서 이해하기 어려웠다
// 처음 좌표가 1,1 이기 때문에 j가 2가 되면 1,3이 되기 때문에 -1 해서
// 두 번째 좌표가 1,2가 될 수 있도록 함
else if(d == 1) // 세로로 놨을 때
{
for(j = 1; j <= l; j++)
a[x + j - 1][y] = 1; // 가로(열) 고정후 세로(행)를 바꿈
}
}
}
for(i = 1; i <= h; i++) // 배열 a를 h * w 크기로 출력
{
for(j = 1; j <= w; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
1099 : [기초 - 2차원 배열] 성실한 개미
문제 설명 : https://codeup.kr/problem.php?id=1099
개미의 이동 경로를 표시하는 문제다.
개미의 이동 경로를 표시하고 개미는 이동하는 방식이 문제 설명에 있다.
기초 마지막 문제답게 어려운 종합문제다.
이 문제도 1098문제와 같이 이해하기 힘들었다.
이해하기 어려운 문제는 코드가 어떻게 지나가는지를 주석을 통해 자세히 설명한다.
이 문제는 지금까지 풀이한 문제들의 종합 문제이기 때문에 한 줄 한 줄 이해해야 완벽히 이해할 수 있었다.
#include <stdio.h>
int main()
{
int i, j, x = 2, y = 2;
int a[11][11] = { 0 };
for(i = 1; i <= 10; i++) // 미로 판의 상황
for(j = 1; j <= 10; j++)
scanf("%d", &a[i][j]); // 10 * 10의 미로 상자
while(a[x][y] != 2) // a[x][y]의 값이 2가 아닐 때까지 반복
{
a[x][y] = 9; // a[x][y]의 값이 2가 아니면 a[x][y]에 9를 넣음
if(a[x][y + 1] != 1) //오른쪽으로 이동한 값이 1이 아니면 오른쪽(열 이동)으로 이동
y += 1;
else if(a[x + 1][y] != 1) // 아래로 이동한 값이 1이 아니면 아래(행 이동)로 이동
x += 1;
else break; // 위 if문이 모두 거짓일 때 반복문 탈출
}
a[x][y] = 9; // 반복문이 끝난 자리의 값을 9로 바꿈
for(i = 1; i <= 10; i++) // 배열 a를 10 * 10 크기로 출력
{ for(j = 1; j <= 10; j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
'CodeUp 기초 100제 > C' 카테고리의 다른 글
CodeUp[코드업] C언어 1093 ~ 1095 : [기초 - 1차원 배열] (0) | 2019.12.09 |
---|---|
CodeUp[코드업] C언어 1086 ~ 1092 : [기초 - 종합] (0) | 2019.12.09 |
CodeUp[코드업] C언어 1078 ~ 1085 : [기초 - 종합] (0) | 2019.12.09 |
CodeUp[코드업] C언어 1071 ~ 1077 : [기초 - 반복 실행구조] (0) | 2019.12.09 |
CodeUp[코드업] C언어 1063 ~ 1070 : [기초 - 삼항연산] ~ [기초 - 조건/선택 실행구조] (0) | 2019.12.09 |
댓글