Game Tech Blog
모래시계 만들기 본문
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
---------------------------------------------------------------------------------------------------
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
입력수 : 9
---------------------------------------------------------------------------------------------------
어려운 문제는 아니었으나, 수식을 도출하는게 머리아파서 계산하다가 수식을 참고했다.
아까도 이렇게 풀었으면 좋았을걸
'Algorithm' 카테고리의 다른 글
알고리즘 교안 학습 -2 [순열, 조합, 정수론] (0) | 2023.08.30 |
---|---|
알고리즘 교안 학습 - 1 [Split, unique, lower_bound, Upper_bound,accumulate,max_element,min_element] (0) | 2023.08.24 |
D사 회사 과제전형 문제 (0) | 2020.11.18 |
TextRPG, 확장판 (0) | 2020.11.14 |
문자열 뒤집기 (0) | 2020.11.12 |