<문제>
바둑판(19 * 19)에 n개의 흰 돌을 놓는다고 할 때,
n개의 흰 돌이 놓인 위치를 출력하는 프로그램을 작성해보는 문제이다
바둑판에 올려 놓을 흰 돌의 개수(n)가 첫 줄에 입력된다.
둘째 줄 부터 n+1 번째 줄까지 힌 돌을 놓을 좌표(x, y)가 n줄 입력된다.
n은 10이하의 자연수이고 x, y 좌표는 1 ~ 19 까지이며, 같은 좌표는 입력되지 않는다.
<틀린 풀이>
#include<stdio.h>
int main(void)
{
int arr[19][19];
int x, y;
int n,i;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d %d", &x, &y);
arr[x][y];
}
printf("%d", arr[19][19]);
return 0;
}
위 코드에는 정말 틀린 부분이 많이 있다.
int arr[19][19]; 이렇게 선언만 해주면 0값으로 초기화가 안된다. 방금 말한대로 선언만 해주었지 초기화는 해주지 않았기 때문이다. 1차원 3차원 배열도 마찬가지이다.
scanf("%d %d", &x, &y); : 좌표만 넣어줫을 뿐 그에 해당하는 값을 주지 않았다. 즉 이렇게만 적으면 아무 의미가 arr[x][y]; 없다.
2차원 배열을 출력하기 위해서는 반복문 중첩이 필수..라고 할 수 있다..
<2번째 틀린 풀이>
#include<stdio.h>
int main(void)
{
int arr[19][19] = { 0 };
int x, y;
int n,i,j;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d %d", &x, &y);
arr[x][y] = 1;
}
for (i = 0; i < 19; i++)
{
for (j = 0; j < 19; j++)
{
printf("%d", arr[i][j]);
}
printf("\n");
}
return 0;
}
int arr[19][19] = { 0 }; 으로 2차원 배열 arr의 배열 요소값들을 모두 0으로 초기화 해주었다.
<문제점>
x, y 좌표는 1 ~ 19 까지이며, 같은 좌표는 입력되지 않는다. 라는 조건을 잘 봐야 하는데, int arr[19][19]에서 가로 세로 길이를 19로 선언하여 줬다, 그러면 우리가 배열의 인덱스 값을 생각 해보았을때, 0~18까지 이고,
그러면, 첫번째 배열요소값은 arr[0][0]이고 마지막 배열요소값은 arr[18][18]이다. 그런데 x의 범위는 1 부터 19까지이므로 배열의 각 요소들과 값이 상응하지 않는 문제가 발생한다. ( x y좌표로 각각 1 1이 입력되었을때, 입력은 첫번째 줄을 생각 하고 입력을 했으나, 실질적으로 인덱스 넘버에 의해 두번째 줄에 입력이 된다는 것.)
그래서 아래와 같이 코드를 수정해 주었다.
<정답 코드>
#include<stdio.h>
int main(void)
{
int arr[20][20] = { 0 };
int x, y;
int n,i,j;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
scanf("%d %d", &x, &y);
arr[x][y] = 1;
}
for (i = 1; i <= 19; i++)
{
for (j = 1; j <= 19; j++)
{
printf("%d", arr[i][j]);
}
printf("\n");
}
return 0;
}
int arr[20][20] = { 0 }; : arr[0][0] 부터 arr[19][19]까지 0으로 초기화를 해주었다.
두번째 for문의 중첩에서 i = 1인것을 볼 수있는데 arr[1][ ]부터 값을 출력하게끔 하기 위함이였다. arr[1][ ]~arr[19][ ] 의 범위가 이 바둑판의 범위가 되는 것이다.
arr[0][0]~arr[0][19] 0번째 줄은 모두 0의 값으로 초기화 되어있는 상태이다. 그렇지만 문제의 조건을 맞추기 위해 출력은 의도적으로 하지 않았다.