본문 바로가기

Coding Tests/코드업

( C ) Code_UP 1098번

 

<문제>

 

https://codeup.kr/problem.php?id=1098 

 

[기초-2차원배열] 설탕과자 뽑기

C언어기초100제v1.2 : @컴퓨터과학사랑, 전국 정보(컴퓨터)교사 커뮤니티/연구회 - 학교 정보(컴퓨터)선생님들과 함께 수업/방과후학습/동아리활동 등을 통해 재미있게 배워보세요.  - 모든 내용

codeup.kr

 

간단하면서도, 간단하지 않은 그런 문제였습니다. 풀던 중 저의 코드에서 예외가 발생하였는데요. 왜 그런가 살펴보겠습니다.

 

<예외 발생>

 

 

예외 발생(0x00007FF605141A50, Project1.exe): 0xC0000005: 0x00007FF60515B000 위치를 기록하는 동안 액세스 위반이 발생했습니다..

 

<에러가 발생한 코드>

 

#include<stdio.h>
int arr[100][100];
int main()
{
	int w, h, n, l, d, x, y;
	scanf("%d %d", &w, &h);
	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		scanf("%d %d %d %d", &l,&d, &x, &y);
		if (d == 0)
		{
			for (int j = y; j < j + l; j++)
			{
				arr[x][j] = 1;
			}
		}
		else
		{
			for (int j = x; j < j + l; j++)
			{
				arr[j][y] = 1;
			}
		}
	}
	for (int k = 0; k < w; k++) {
		for (int n = 0; n < h; n++)
		{
			printf("%d ", arr[k][n]);
		}
		printf("\n");
	}
	return 0;
}

 

위 에러가 발생한 이유는 할당되지 않은 메모리를 사용하려 해서 라고 생각하면 될것 같습니다. 

아래 코드가 에러가 발생한 부분인데요!

 

for (int j = y; j < j + l; j++)
			{
				arr[x][j] = 1;
			}

 

for문의 조건식 부분에 j < j+l과 같이 되어있습니다. 선언식 부분에서 j = y이고, 그러면 j+l 은  y+l이니, 무슨 문제가 있지 할 수도 있지만, j++이 되니 j < j+l 부분에서 j가 커지면 j+l도 같이 커지기에 < 부등호의 의미가 없어지게 됩니다. 즉 무한정 j++이 되어 결국 선언된 이차원 배열의 범위를 벗어나게 되는 것입니다. 

 

그래서 코드를 아래와 같이 수정해주었습니다. 

 

<Pass>

 

#include<stdio.h>
int arr[100][100];
int main()
{
	int w, h, n, l, d, x, y;
	scanf("%d %d", &w, &h);
	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		scanf("%d %d %d %d", &l, &d, &x, &y);
		if (d == 0)
		{
			for (int j = y; j < y + l; j++)
			{
				arr[x][j] = 1;
			}
		}
		else
		{
			for (int j = x; j < x + l; j++)
			{
				arr[j][y] = 1;
			}
		}
	}
	for (int k = 1; k < w+1; k++) {
		for (int n = 1; n < h+1; n++)
		{
			printf("%d ", arr[k][n]);
		}
		printf("\n");
	}
	return 0;
}