본문 바로가기

Coding Tests/코드업

( C ) 코드업 1096번(2차원 배열 활용)

<문제>

바둑판(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의 값으로 초기화 되어있는 상태이다. 그렇지만 문제의 조건을 맞추기 위해 출력은 의도적으로 하지 않았다.