개발 프로젝트/Hive Helsinki [42 Helsinki]

[Hive Helsinki / Piscine] Rush00

iinana 2024. 3. 14. 22:47
728x90

 Rush00은 주어진 패턴 모양대로, 인자로 받은 크기의 직사각형을 출력하는 문제이다. 결론부터 말하자면 나는 42%로 fail했다. 원인은 음수나 0이 크기로 주어졌을 때, 아무것도 출려해서는 안되지만 new line을 출력하는 오류를 범했기 때문이다. 코드는 수정된 코드로 기재할 것이나. 러시를 통과한 코드는 아니니 참고 시에 유의 바란다. 

 

 우선 해당 rush 과제는 총 3개의 파일을 요구하는데, main 함수를 포함하는 main.c 파일, ft_putchar 함수를 포함하는 ft_putchar.c 파일 그리고 우리가 주요하게 작성해야 하는 파일인 rush0X.c 파일이다. rush0X.c 파일에 작성된 코드에 앞서 이미 문제에 주어진 main.c와 (평균적인 속도라면) 이미 앞선 C프로젝트에서 만들었을 ft_putchar.c 파일을 코드를 먼저 공유한다. 

 ft_putchar.c 

#include <unistd.h>

void	ft_putchar(char c)
{
	write(1, &c, 1);
}

 main.c 

#include <unistd.h>

void	rush(int a, int b);

int	main(void)
{
	rush(374, -382);
	return (0);
}

 

 

 다음으로는 ruch0X.c 파일이다. 원래는 본인 팀에게 배정된 하나씩만 하면 되지만, 과제 난이도가 크게 어렵지 않았고, 다른 문제까지 하면 보너스 점수를 받을 수 있기 때문에 모두 작성하였다. 물론 본 과제를 통과하지 못해 모두 무용지물이 되었지만...

 

 rush00.c 

 rush00는 가장 간단하다. rush00는 각 꼭짓점에 'o' 문자를,  가로 모서리에 '-' 문자를, 세로 모서리에 '|' 문자를, 나머지에는 공백을 출력하면 되는 문제이다. 우선 row를 변수 x, column을 변수 y로 잡는다. rush 함수에서는 인자로 a가 column, b가 row로 우리가 수학적으로 알던 (x, y)의 순서와는 반대로 주어지므로 코드를 작성할 때 순서에 주의해야 한다.

 그리고 주어진 a나 b가 0보다 작거나 같으면 아무것도 출력이 되면 안되므로 함수를 종료해 준다. 우리 팀은 이 부분을 틀려서 fail을 받게 되었다. 둘 중 하나가 0보다 작거나 같으면 while문 자체가 실행되지 않을 것이라는 예상과는 달리 b가 0보다 작거나 같지만 a가 0보다 크면 new line character가 출력되었다. 

 이후 x의 초깃값을 1로 설정(보통 코드에서 초깃값을 0으로 설정하지만, 팀원들이 모두 코딩이나 수학적인 기반이 없어서 이해를 돕기 위해 1부터로 설정했다.)하고 이중 while문을 통해 각 위치별로 적절한 문자를 출력해 준다. 그리고 내부 while문이 끝나면 한 열이 끝났다는 뜻이므로 new line character를 출력해 줘서 다음 열로 넘어간다. 

int	ft_putchar(int character);

void	rush(int a, int b)
{
	int		x;
	int		y;

	if (a <= 0 || b <= 0)
		return ;
	x = 1;
	while (x <= b)
	{
		y = 1;
		while (y <= a)
		{
			if ((x == 1 || x == b) && (y == 1 || y == a)) // 모든 꼭짓점
				ft_putchar('o');
			else if (x == 1 || x == b)	// 가로 모서리
				ft_putchar('-');
			else if ((y == 1) || (y == a))	// 세로 모서리
				ft_putchar('|');
			else
				ft_putchar(' ');
			y++;
		}
		ft_putchar('\n');
		x++;
	}
}

 

 

 rush01.c 

 

 rush01은 rush00과 비슷하지만, 꼭짓점이 같은 위치가 다르고, 다만 모서리 부분의 문자가 모두 통일되었다는 점에서 다르다. 왼쪽위 그리고 오른쪽아래 꼭짓점은 '/', 오른쪽 위 그리고 왼쪽 아래 꼭짓점에는 '\'을 출력해줘야 한다. 그 외 모든 모서리 부분은 '*' 그 외 파트는 공백을 출력해 준다. 아무래도 같은 문자를 출력해야 하는 꼭짓점 간의 공통점이 적다 보니 조건을 설정하는 게 조금 더 까다롭다. 따라서 check()이라는 helper function을 만들어줬다. 조건에 b가 1이 아닐 때를 추가한 부분이 있는데, b가 1이면 첫 번째 열만 출력되어야 하는데 해당 조건을 추가하지 않는 경우 마지막 열 조건에 먼저 걸려서 꼭짓점이 잘못 출력될 수 있다. 이를 방지하기 위해서 해당 조건을 아래 꼭짓점 조건에 한해서만 추가해 줬다. 나머지 구조는 rush00과 동일하다. 

int	ft_putchar(int character);

void	check(int a, int b, int x, int y)
{
	if ((x == 1) && (y == 1))	// 왼쪽위 꼭짓점
		ft_putchar('/');
	else if ((x == b) && (y == 1) && (b != 1))	// 왼쪽아래 꼭짓점
		ft_putchar('\\');
	else if ((x == b) && (y == a) && (b != 1))	// 오른쪽아래 꼭짓점
		ft_putchar('/');
	else if ((x == 1) && (y == a))	// 오른쪽위 꼭짓점
		ft_putchar('\\');
	else if ((x == 1) || (x == b) || (y == 1) || (y == a))	// 나머지 모서리
		ft_putchar('*');
	else
		ft_putchar(' ');
}

void	rush(int a, int b)
{
	int		x;
	int		y;

	if (a <= 0 || b <= 0)
		return ;
	x = 1;
	while (x <= b)
	{
		y = 1;
		while (y <= a)
		{
			check(a, b, x, y);
			y++;
		}
		ft_putchar('\n');
		x++;
	}
}

 

 

 rush02.c 

 

 rush02는 rush00의 구조와 유사하지만 모서리가 모두 동일한 문자라는 차이가 있다. 그래서 오히려 조건이 더 간단해진다. 위쪽에 있는 꼭짓점들은 'A'를 아래에 있는 꼭짓점들은 'C'를 나머지 모서리에는 'B'를, 이외 공간에는 공백을 출력해주면 된다. 나머지 구조는 앞선 rush 코드와 비슷하다. 

int	ft_putchar(int character);

void	rush(int a, int b)
{
	int		x;
	int		y;

	if (a <= 0 || b <= 0)
		return ;
	x = 1;
	while (x <= b)
	{
		y = 1;
		while (y <= a)
		{
			if ((x == 1) && ((y == 1) || (y == a)))	// 위쪽 꼭짓점
				ft_putchar('A');
			else if ((x == b) && ((y == 1) || (y == a)) // 아래쪽 꼭짓점
				ft_putchar('C');
			else if ((x == 1) || (x == b) || (y == 1) || (y == a))	// 나머지 모서리
				ft_putchar('B');
			else
				ft_putchar(' ');
			y++;
		}
		ft_putchar('\n');
		x++;
	}
}

 

 

 rush03.c 

  rush03 역시 앞선 코드들의 구조와 비슷하지만, 왼쪽 꼭짓점끼리 같고, 오른쪽 꼭짓점끼리 같으며, 이 외 모든 모서리가 동일한 문자라는 점이 포인트이다. 조건 외 구조는 유사하므로 설명은 생략하겠다. 

int	ft_putchar(int character);

void	rush(int a, int b)
{
	int		x;
	int		y;

	x = 1;
	while (x <= b)
	{
		y = 1;
		while (y <= a)
		{
			if ((y == 1) && ((x == 1) || (x == b)))	// 왼쪽 꼭짓점
				ft_putchar('A');
			else if ((y == a) && ((x == 1) || (x == b)))  // 오른쪽 꼭짓점
				ft_putchar('C');
			else if ((x == 1) || (x == b) || (y == 1) || (y == a))  // 나머지 모서리
				ft_putchar('B');
			else
				ft_putchar(' ');
			y++;
		}
		ft_putchar('\n');
		x++;
	}
}

 

 

 rush04.c 

 

 rush04는 rush01과 완전히 동일한 구조이지만 표현되는 문자만 다르다. 따라서 코드 구조도 rush01과 동일하다. 따라서 rush01 코드에서 '/'를 'A'로, '\'를 'C'로, '*'를 'B'로 바꿔주기만 하면 된다. 

int	ft_putchar(int character);

void	check(int a, int b, int x, int y)
{
	if ((x == 1) && (y == 1))	// 왼쪽위 꼭짓점
		ft_putchar('A');
	else if ((x == b) && (y == 1) && (b != 1))	// 왼쪽아래 꼭짓점
		ft_putchar('C');
	else if ((x == b) && (y == a) && (b != 1))	// 오른쪽아래 꼭짓점
		ft_putchar('A');
	else if ((x == 1) && (y == a))	// 오른쪽위 꼭짓점
		ft_putchar('C');
	else if ((x == 1) || (x == b) || (y == 1) || (y == a))	// 나머지 모서리
		ft_putchar('B');
	else
		ft_putchar(' ');
}

void	rush(int a, int b)
{
	int		x;
	int		y;

	if (a <= 0 || b <= 0)
		return ;
	x = 1;
	while (x <= b)
	{
		y = 1;
		while (y <= a)
		{
			check(a, b, x, y);
			y++;
		}
		ft_putchar('\n');
		x++;
	}
}
728x90