Game Tech Blog

모래시계 만들기 본문

Algorithm

모래시계 만들기

jonghow 2020. 11. 14. 19:11
반응형

2020 C 코딩테스트 1번 문제..

조건 

1. 가로세로가 n 인 사각형이 주어짐 (n은 양수이며, 그 중에서도 홀 수만 주어진다.)

2. Input과 Output은 다음과 같다.

Input

5

Output

1 2 3 4 5
0 2 3 4 0
0 0 3 0 0
0 2 3 4 0
1 2 3 4 5

 

 

---------------------------------------------------------------------------------------------------

풀이

1. 먼저 섹션을 생각해보자.

2. 별을 먼저 찍어보고, 숫자로 출력해보자.

 

풀면서, 내 접근 방식이 틀렸다는 것은 두가지였다.

하나는 무의식적으로 메모리를 할당하여 하는 방법을 선택했다는 점

또 하나는, 처음부터 0이 아닌 수의 오른쪽 섹션을 생각했다는 점 이다.

 

가장 중요한건 섹션별로 생각하는 것이었다.

 

---------------------------------------------------------------------------------------------------

Step1. 별로 찍은 모래시계

#include "stdafx.h"
#include<iostream>
using namespace std;

int main(void)
{
	int n, s, e;
	cin >> n; 	// n은 입력받을 수
	s = 0;		// 문자열이 시작할 지점
	e = n;		// 문자열이 끝날 지점

	for (int i = 0; i < n; i++)
	{
		if (i <= (n / 2)) // 절반 까지는 양폭이 감소
		{
			s = i; e--;
		}
		else // 절반 이후는 양폭이 증가
		{
			s--; e++;
		}

		for (int j = s; j > 0; j--)
		{
			cout << " ";
		}

		for (int k = s; k <= e; k++)
		{
			cout << "*";
		}

		cout << endl;
	}// 루프돌 함수
	return 0;
}

결과

입력 수 : 5 

입력 수 5인, 모래시계

---------------------------------------------------------------------------------------------------

Step2. 수로 찍은 모래시계

#include "stdafx.h"
#include<iostream>
using namespace std;

int main(void)
{
	int n, s, e, ivalue;
	cin >> n; 	// n은 입력받을 수
	s = 0;		// 문자열이 시작할 지점
	e = n;		// 문자열이 끝날 지점
	ivalue = 1; // 별 대신 들어갈 숫자
	

	for (int i = 0; i < n; i++)
	{
		if (i <= (n / 2)) // 절반 까지는 양폭이 감소
		{
			s = i; e--;
		}
		else // 절반 이후는 양폭이 증가
		{
			s--; e++;
		}

		for (int j = s; j > 0; j--)
		{
			cout << "0";
			ivalue++;
		}

		for (int k = s; k <= e; k++)
		{
			cout << ivalue;
			ivalue++;
		}

		cout << endl;
		ivalue = 1;
	}// 루프돌 함수
	return 0;
}

결과

별을 숫자로, 공백을 0 으로 변화시켰지만...

결과론적으로, 원하는 것이 아니다. 비록 형태는 비슷해졌으나, 완벽하지 않다.

 

입력수 : 5

---------------------------------------------------------------------------------------------------

Step3. 수로 찍은 모래시계 - 보완

int main(void)
{
	int n, s, e, ivalue;
	cin >> n; 	// n은 입력받을 수
	s = 0;		// 문자열이 시작할 지점
	e = n;		// 문자열이 끝날 지점
	ivalue = 1; // 별 대신 들어갈 숫자
	

	for (int i = 0; i < n; i++)
	{
		if (i <= (n / 2)) // 절반 까지는 양폭이 감소
		{
			s = i; e--;
		}
		else // 절반 이후는 양폭이 증가
		{
			s--; e++;
		}

		for (int j = s; j > 0; j--)
		{
			cout << "0";
			ivalue++;
		}

		for (int k = s; k <= e; k++)
		{
			cout << ivalue;
			ivalue++;
		}

		for (int j = s; j > 0; j--)
		{
			cout << "0";
		}

		cout << endl;
		ivalue = 1;
	}// 루프돌 함수
	return 0;
}

결과

왼쪽 섹션에서 찍은 그대로, 0이 아닌 숫자값을 찍은후에 찍으면 될것 같아서 그대로 사용하였더니, 오른쪽도 만족스럽게 찍었다.

원하는 값이다.

단 오른쪽을 찍을 때는 더이상 수의 증가가 필요없기 때문에 증가하지 않았다.

 

입력수 : 5

입력수 5의 모래시계

입력수 : 9

입력수 9의 모래시계

---------------------------------------------------------------------------------------------------

 

어려운 문제는 아니었으나, 수식을 도출하는게 머리아파서 계산하다가 수식을 참고했다.

아까도 이렇게 풀었으면 좋았을걸

 

반응형
Comments