본문 바로가기
알고리즘/CodeUp PS

[CodeUp][Python] 1365번 : 사각형 출력하기 3

by 빛밤하늘 2021. 10. 4.
반응형

밑의 링크는 CodeUp에서의 문제 링크입니다.

문제는 링크를 통해서 직접 봐주시길 바랍니다.

 

사각형 출력하기 3

********* ** ** * * * * * * * * * * * * * * * * * * * ** ** *********

codeup.kr

 

 

 

주의해야 할 점

1. readline과 int나 float를 사용하는 입력 방식

readline을 사용해서 입력할 때는 맨 끝에 \n이 붙어서 입력됩니다.

하지만, 입력한 값을 int나 float으로 처리해 정수, 실수형으로 만들어 줄 때는 

굳이 \n을 떼기 위해 rstrip을 사용할 필요가 없습니다.

숫자 형태를 만들어줄 때 자동으로 사라집니다.

num = int(sys.stdin.readline())

 

 

예제 설명

1. 첫 번째 예제

- 입력

9

 

- 출력

티스토리 본문에서는 별 *과 공백의 크기가 달라서 그런지

문제의 출력 예시처럼 깔끔한 상태로 입력되지 않네요.

깔끔한 출력 예시를 보시려면 상단에서 문제 링크로 들어가서 보시길 바랍니다.

*********
**     **
* *   * *
*  * *  *
*   *   *
*  * *  *
* *   * *
**     **
*********

 

- 설명

입력한 사각형의 크기 n은 9입니다.

첫 번째 줄과 마지막 줄에는 별 *을 9개 출력하고,

가운데 줄에는 별 3개와 각 별 사이에 공백을 3개 넣어서 출력합니다.

나머지 줄에서는 공백의 개수가 5개이며,

첫 번째 줄과 가운데 줄 사이의 줄에서는 두 번째 별과 세 번째 별 사이의 공백을 5 → 3 → 1,

가운데 줄과 마지막 줄 사이의 줄에서는 두 번째 별과 세 번째 별 사이의 공백을 1 → 3 → 5로

만들어 출력해 대각선이 포함된 9*9 사각형을 출력합니다.

 

 

생각한 풀이 과정

대각선이 있는 사각형을 출력할 때 첫 번째 줄, 가운데 줄, 마지막 줄,

그리고 첫 번째 줄과 가운데 줄 사이, 가운데 줄과 마지막 줄 사이를 각각 나눠 출력합니다.

 

3 <= n <= 100인 사각형의 크기 n을 입력하고, int형으로 변환합니다.

n = int(stdin.readline())

 

가운데 줄을 제외한 공백이 있는 나머지 줄에서 공백의 개수는 n - 4로 같습니다.

이 값을 변수 blank_cnt에 저장합니다.

blank_cnt = n - 4

 

1. 첫 번째 줄

첫 번째 줄은 단순히 n개의 별 *를 출력한 것입니다.

print('*' * n)

 

2. 첫 번째 줄과 가운데 줄 사이

- 반복문 시작

한 줄에서 첫 번째 별과 두 번째 별 사이의 공백의 개수를 0 ~ blank_cnt // 2까지 반복합니다.

for side_blank_cnt in range(blank_cnt // 2 + 1):

 

한 줄에 해당하는 *(공백1)*(공백2)*(공백3)*에서 공백의 개수를 각각 계산하고 출력합니다.

공백1, 공백3에서 공백의 개수는 side_blank_cnt이며,

공백2에서 공백의 개수는 blank_cnt에서 side_blank_cnt의 2배를 뺀 값입니다.

print('*', end='')
print(' ' * side_blank_cnt, end='')
print('*', end='')
print(' ' * (blank_cnt - side_blank_cnt * 2), end='')
print('*', end='')
print(' ' * side_blank_cnt, end='')
print('*')

- 반복문 끝

 

3. 가운데 줄

가운데 줄은 n이 홀수일 때만 출력하면 됩니다.

*(공백1)*(공백2)* 형식이고, 공백1, 공백2에서 공백의 개수는 blank_cnt // 2 + 1개입니다.

if n % 2 == 1:
    print(f'*{" " * (blank_cnt // 2 + 1)}*{" " * (blank_cnt // 2 + 1)}*')

 

4. 가운데 줄과 마지막 줄 사이

- 반복문 시작

한 줄에서 첫 번째 별과 두 번째 별 사이의 공백의 개수를 blank_cnt // 2 ~ 0까지 역순으로 반복합니다.

for side_blank_cnt in range(blank_cnt // 2, -1, -1):

 

한 줄에 해당하는 *(공백1)*(공백2)*(공백3)*에서 공백의 개수를 각각 계산하고 출력합니다.

공백1, 공백3에서 공백의 개수는 side_blank_cnt이며,

공백2에서 공백의 개수는 blank_cnt에서 side_blank_cnt의 2배를 뺀 값입니다.

print('*', end='')
print(' ' * side_blank_cnt, end='')
print('*', end='')
print(' ' * (blank_cnt - side_blank_cnt * 2), end='')
print('*', end='')
print(' ' * side_blank_cnt, end='')
print('*')

- 반복문 끝

 

5. 마지막 줄

마지막 줄은 첫 번째 줄과 같이 단순히 n개의 별 *를 출력한 것입니다.

print('*' * n)

 

 

제출한 파이썬 코드

# readline을 사용하기 위해 import합니다.
from sys import stdin


# 사각형의 크기 n을 정수로 입력합니다.
# 3 <= n <= 100
# int형으로 변환합니다.
n = int(stdin.readline())
# 가운데 줄을 제외한 공백이 있는 줄에서 공백의 개수를 저장하는 변수를 선언합니다.
blank_cnt = n - 4

# 사각형의 첫 번째 줄인 별 *를 n개만큼 출력합니다.
print('*' * n)

# 사각형의 첫 번째 줄부터 가운데 줄 사이를 출력하는 부분입니다.
# 한 줄에서 첫 번째 별과 두 번째 별 사이 공백의 개수를 0 ~ blank_cnt // 2까지 반복합니다.
for side_blank_cnt in range(blank_cnt // 2 + 1):
    # 별 하나를 출력하고 다음 줄로 내리지 않습니다.
    print('*', end='')
    # 공백을 현재 숫자인 side_blank_cnt만큼 출력하고, 다음 줄로 내리지 않습니다.
    print(' ' * side_blank_cnt, end='')
    # 별 하나를 출력하고 다음 줄로 내리지 않습니다.
    print('*', end='')
    # 두 번째 별과 세 번째 별 사이 공백의 개수는 blank_cnt에서 
    # 첫 번째 별과 두 번째 별 사이의 공백 개수, 세 번째 별과 네 번째 별 사이의 공백 개수 합을
    # 뺀 것이므로 그만큼 공백을 출력하고, 다음 줄로 내리지 않습니다.
    print(' ' * (blank_cnt - side_blank_cnt * 2), end='')
    # 별 하나를 출력하고 다음 줄로 내리지 않습니다.
    print('*', end='')
    # 공백을 현재 숫자인 side_blank_cnt만큼 출력하고, 다음 줄로 내리지 않습니다.
    print(' ' * side_blank_cnt, end='')
    # 별 하나를 출력하고 다음 줄로 넘어갑니다.
    print('*')

# 사각형의 길이가 홀수인 경우 가운데 줄을 출력합니다.
if n % 2 == 1:
    # 별 * 3개 사이의 공백 개수는 blank_cnt를 2로 나누고 1을 더한 값입니다.
    # 출력 형식에 맞게 *(공백)*(공백)*을 출력합니다.
    print(f'*{" " * (blank_cnt // 2 + 1)}*{" " * (blank_cnt // 2 + 1)}*')

# 사각형의 가운데 줄과 마지막 줄 사이를 출력하는 부분입니다.
# 한 줄에서 첫 번째 별과 두 번째 별 사이 공백의 개수를 blank_cnt // 2부터 0까지 반복합니다.
for side_blank_cnt in range(blank_cnt // 2, -1, -1):
    # 별 하나를 출력하고 다음 줄로 내리지 않습니다.
    print('*', end='')
    # 공백을 현재 숫자인 side_blank_cnt만큼 출력하고, 다음 줄로 내리지 않습니다.
    print(' ' * side_blank_cnt, end='')
    # 별 하나를 출력하고 다음 줄로 내리지 않습니다.
    print('*', end='')
    # 두 번째 별과 세 번째 별 사이 공백의 개수는 blank_cnt에서 
    # 첫 번째 별과 두 번째 별 사이의 공백 개수, 세 번째 별과 네 번째 별 사이의 공백 개수 합을
    # 뺀 것이므로 그만큼 공백을 출력하고, 다음 줄로 내리지 않습니다.
    print(' ' * (blank_cnt - side_blank_cnt * 2), end='')
    # 별 하나를 출력하고 다음 줄로 내리지 않습니다.
    print('*', end='')
    # 공백을 현재 숫자인 side_blank_cnt만큼 출력하고, 다음 줄로 내리지 않습니다.
    print(' ' * side_blank_cnt, end='')
    # 별 하나를 출력하고 다음 줄로 넘어갑니다.
    print('*')

# 사각형의 마지막 줄인 별 *를 n개만큼 출력합니다.
print('*' * n)

 

 

제출 결과

CodeUp 1365번 : 사각형 출력하기 3에서 코드 제출 결과
CodeUp 1365번 : 사각형 출력하기 3에서 코드 제출 결과

 

 

느낀 점

풀고 나서 다시 한번 보니 너무 복잡하게 푼 것 같네요... 😅😅

더 간단히 푸는 방법이 있는지 공부해봐야겠습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

※ 공감 버튼과 구독 버튼도 잊지 말고 꾹 눌러주시면 감사하겠습니다~👍👍

반응형

댓글