밑의 링크는 CodeUp에서의 문제 링크입니다.
문제는 링크를 통해서 직접 봐주시길 바랍니다.
주의해야 할 점
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)
제출 결과
느낀 점
풀고 나서 다시 한번 보니 너무 복잡하게 푼 것 같네요... 😅😅
더 간단히 푸는 방법이 있는지 공부해봐야겠습니다.
댓글