Algorithm/Cases-BOJ

숫자 피라미드

Xi_kor 2020. 4. 25. 22:25

문제

 

N과 시작 숫자 S가 주어지면 숫자 피라미드를 만드는 프로그램을 작성하시오.
예를 들어, N 5이고 S 3 이라면, 그 숫자 피라미드는 다음과 같다.

    3

   456

  21987

 3456789

987654321

  • 시작 숫자 S는 꼭대기부터 1씩 증가한다.
  • 시작 행의 번호가 1번이라고 했을때, 짝수번째 행은 왼쪽에서 오른쪽으로 1씩 증가하도록 적고, 홀수번째 행은 거꾸로 적는다.
  • 숫자가 만약 10이 될 경우, 1로 바꾸고 다시 증가한다.  

입력

 

입력의 첫 번째 줄에 N과 시작 숫자 S가 주어진다. ( 1≤N≤100, 1 ≤S≤ 9)

 

출력

 

첫 번째 줄부터 숫자 피라미드를 출력한다. (각 줄에 존재하는 공백의 개수와 숫자의 개수를 정확하게 확인해주시바랍니다.)

 

예제 입력

5 3

예제 출력

    3

   456

  21987

 3456789

987654321

 

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

첫째 줄을 제외한 홀수 줄과 짝수 줄의 규칙을 찾아내었다. 짝수층의 시작은 이전 시작+1, 홀수층의 마지막은 이전 마지막+1 이라는 규칙을 찾았음. 이를 이용해서 기존 피라미드와 비슷한 방식으로 짜보았음.

 

#include  <iostream>
using namespace std; 

int main() { 
	int n, s; 
	int currentFirst, currentLast, previousFirst, previousLast; 
	cin >> n >> s; 

	int a = 1; 

	for (int i = 0; i < n; i++) {//출력할 층의 수 
		for (int j = 0; j < n - a; j++) { 
			cout << " ";//공백 출력 
		} 
		if (a == 1) { 
			previousFirst = s; 
			cout << s; 
		} 
		else if (a % 2 == 1) { 
			currentLast = previousLast + 1; 
			if (currentLast >= 10) currentLast = 1; 
			for (int k = 0; k < 2 * a - 1; k++) { 
				currentFirst = currentLast; 
				currentLast += 1; 
				if (currentLast >= 10) currentLast = 1; 
			} 
			previousFirst = currentFirst; 

			for (int k = 0; k < 2 * a - 1; k++) { 
				cout << currentFirst; 
				currentFirst = currentFirst - 1; 
				if (currentFirst <= 0) currentFirst = 9; 
			} 
		} 
		else { 
			currentFirst = previousFirst + 1; 
			if (currentFirst >= 10) currentFirst = 1; 

			for (int j = 0; j < 2 * a - 1; j++) { 
				cout << currentFirst; 
				currentFirst = currentFirst + 1; 
				if (currentFirst >= 10) currentFirst = 1; 
			} 
			currentLast = currentFirst - 1; 
			if (currentLast <= 0) currentLast = 9; 
			previousLast = currentLast; 
		} 
		a++; 
		cout << endl; 
	} 

	return 0; 
}

 

//자잘자잘하게 생각할게 너무 많아서 어려웠다...