python 별찍기 코딩테스트 연습

치섭·2021년 11월 30일
0

코딩테스트

목록 보기
1/1

오늘은 쉬워보이지만 은근히 까다로운 별찍기를 연습해보도z록 하겠다.
내용은 직각 삼각형, 직각 삼각형 뒤집기, 사각형, 마름모 등이다.

1. 직각 삼각형

직각 삼각형을 만들기 위해서는 어떻게 해야할까?
우선 첫번째 줄엔 별이 1개, 두번째 줄엔 2개 이런식으로 출력되어야할 것이다.
for문을 이용하면 될 것 같다.

star = 5
star = star+1

for i in range(1, star):
    print('*'*i)

우선 star 변수에 5를 넣어 범위를 정했다. 그러니까, 5줄 짜리 삼각형을 만들겠다는 뜻이다.
그리고 star에 1을 더해서 원하는 범위가 나올 수 있게 지정해주었다.
for문으로 출력해서 한 줄마다 *이 1개씩 늘어나게 출력해서 직각 삼각형을 만들었다.

#output
*
**
***
****
*****

2. 반대 직각삼각형

그럼 뒤집어진 직각 삼각형은 어떻게 출력해야할까?
우선 첫번째 줄에는 공백이 있고, 그 다음에 별이 1개 출력된다.
두번째 줄에도 공백이 있지만 첫번째 줄보다는 공백이 1칸 적다.
그 다음 별이 2개 출력되는 식이다.

for i in range(1, star):
    print((' '*(star-i))+'*'*i)

직각 삼각형 코드와 동일하지만 별이 찍히기 전에 공백이 있으므로 ' ' (공백) x 범위 - i로 먼저 공백을 주었다.
그러니까 범위인 5 빼기 1을 하면 공백은 4칸, 2를 빼면 공백이 3칸 이런식이 된다.
그리고 마찬가지로 i의 수만큼 *을 출력해주면 된다.

#output
     *
    **
   ***
  ****
 *****

3. 이등변 삼각형

직각 삼각형은 한 면이 무조건 직선이라 쉬웠지만 이번에는 이등변 삼각형을 출력해보도록 하겠다.
우선은 왼쪽에 공백이 있고, 가운데에 을 찍고 또 오른쪽에도 공백이 있어야한다.
다음 줄은 양쪽 공백이 한개 씩 줄고, 가운데에
을 찍는데 비율을 맞추기 위해 양 옆으로 *이 하나씩 늘어나야한다.
그러니까 별이 찍히는 갯수는 1,3,5 이런식으로 가야한다.

for i in range(1, star):
    print(" "*(star-i)+"*"*(i*2-1))

마찬가지로 5를 범위로 주고 for문을 돌린다.
뒤집어진 직각 삼각형을 출력했을 때와 마찬가지로 " " x (star-i)을 이용해 공백을 출력한다.
그리고 별을 찍는데 이때 양 쪽에 각각 1개씩 더 늘어나야하므로 i x 2를 해준 후 1을 뺀다.
그러니까 for문이 한번 돌아갈 때는 (1 x 2)-1 즉 1개가 찍히고
두번째 돌아갈 때는 (2 x 2)-1 즉 3개가 찍히게 된다.
총 5번을 돌리게 되니 마지막 줄은 (5 x 2)-1 = 9.
9개의 *이 찍히게 된다.

 # output
     *
    ***
   *****
  *******
 *********

4. 사각형

사각형은 매우 쉽다. 그냥 몇 줄 출력할지만 정하면 된다.
일단 star의 수만큼 *을 찍기로 했다.

for i in range(1, star):
    print("*"*star)
#output
******
******
******
******
******

5. 속이 빈 사각형

그렇다면 속이 빈 사각형은 어떨까?
우선 맨 왼쪽과 맨 오른쪽은 *이 1개씩 각각 출력되어야하고,
맨 윗줄과 맨 아랫줄은 공백없이 출력되어야한다.
if문을 쓸 때가 온 것이다.

for i in range(1, star):
    if (i == 1) or (i==star-1):
        print("*"*star)
    else:
        print("*"+" "*(star-2), end='*\n')

만약 i가 1이거나 star-1(마지막 번호) 일 경우에는 공백없이 출력하기 위해 "" x star를 출력한다.
그 외의 경우에는 우선 "
"를 출력하고 + 공백 x star-2을 해준다.
왜 -2을 하냐면 이미 *이 2개 출력 되었으니 그 부분을 빼주고 공백만 남기는 것이다.

그러니까 star가 6인 상태에서

1 2 3 4 5 6

* * * * * *

* . . . . *

star 길이 (6)에서 양옆 별 개수만큼인 2를 빼주고 공백(여기선 .으로 표시)을 4 출력하는 것이다

# output
******
*    *
*    *
*    *
******

5. 마름모

다음은 마름모이다. 고깃집 가면 포장 안되어있는 그 박하사탕 모양이다.
마름모는 삼각형과 뒤집혀진 삼각형이 붙어있는 모양이니까
삼각형 2개를 출력한다고 생각했다.
더 세련된 방법이 있을 것 같지만... 우선 내가 한 방법은 이렇다.

# 마름모

minus = 0
for i in range(1, star):
    if i <= star/2:
        print(" "*(star-i)+"*"*(i*2-1))
    else:
        for j in range(int(star/2), 1, -1):
            minus = minus+1
            print(" "*(minus+i-1)+"*"*(j*2-3))
        break

우선 아까 이등변 삼각형을 출력한 코드와 동일하게 진행하는데,
마름모의 반을 기준으로 위쪽만 일반 이등변 삼각형이므로 star/2로 반을 나누어주었다.
그리고 if문으로 반쪽짜리 이등변 삼각형을 출력한다.
다음으론 뒤집어진 이등변삼각형인데,
range(시작 값, 끝값, 증가값)를 이용해서
range(int(star/2), 1, -1) 그러니까 range(3, 1, -1)이렇게 입력해주었다.
그리고 맨 위에서 0으로 정의했던 minus를 for문 한번 돌아갈 때마다 1씩 더해서
공백이 들어갈 횟수를 만들어줬다.

# output
     *
    ***
   *****
    ***
     *

느낀점

별찍기 처음 봤을 땐 그닥 어렵지 않다고 생각했는데
파이썬 초보인 나는 은근 고민이 필요했다.
더욱 많은 연습이 필요할듯!

profile
주니어 웹개발자

0개의 댓글