# Problem

Consider a staircase of size `n = 4`

:

```
#
##
###
####
```

Write a program that prints a staircase of size `n`

.

# Solution

For every n size there are n elements to print which makes the overall complexity O(N^2).

## Naive solution

In the simple case string concatenation is used to build a row and then the row is printed.

Time = O(N^2) Space = O(N)

### Staircase naive in Python 3

```
def staircase(n):
for i in range(1, n + 1):
spaces = " " * (n - i)
stairs = "#" * i
print(spaces + stairs)
```

## Space optimized solution

Since N inputs must be evaluated N times the time complexity must be N^2.

Storage can be reduced to constant time by comparing whether the column is within a boundary value.

The model is a square matrix where every value past the diagonal is filled.

```
0001
0011
0111
1111
```

This is determined by `boundary = size - (row + 1)`

.

Time = O(N^2) Space = O(1)

### Staircase optimized in Python 3

```
def staircase(n):
for x in range(n**2):
i, j = divmod(x, n)
if j >= (n - (i + 1)):
print("#", end="")
if j == (n - 1):
print()
else:
print(" ", end="")
```