본문 바로가기

Univ/Python Programming

[문제 06] X 모양 별 그리기 - Python 풀이

홀수 정수 N이 주어지면 높이와 너비가 N인 X 모양 별 패턴을 출력하는 프로그램을 작성한다. 각 행에서는 두 대각선 위치에만 별을 출력하며, 마지막으로 출력된 별 뒤에는 공백을 출력하지 않는다.

입력 예시

첫째 줄에 홀수 정수 N이 주어진다. (3 <= N <= 10)

출력 예시

크기 N의 X 모양 별 패턴을 출력한다.

예제 테스트케이스

예제 1

입력 예시
출력 예시
3
* *
 *
* *

예제 2

입력 예시
출력 예시
5
*   *
 * *
  *
 * *
*   *

예제 3

입력 예시
출력 예시
7
*     *
 *   *
  * *
   *
  * *
 *   *
*     *

 


정답 코드

N = int(input())

for i in range(N):
    line = ""
    for j in range(N):
        if j == i or j == N - i - 1:
            line += "*"
        else:
            line += " "
    print(line.rstrip())

1. 코드 동작 설명

  • 이 코드는 N x N 크기의 격자를 한 칸씩 확인하면서 X 모양 위치에만 *을 넣는다.
  • 바깥쪽 반복문 for i in range(N)은 몇 번째 줄인지를 의미한다.
  • 안쪽 반복문 for j in range(N)은 그 줄의 몇 번째 칸인지를 의미한다.

예를 들어 N = 5이면 좌표를 다음처럼 생각할 수 있다.

  • i: 행 번호
  • j: 열 번호

즉, (i, j) 위치를 하나씩 검사하는 방식이다.

1단계: 줄 단위 반복

for i in range(N):
  • 첫째 줄부터 마지막 줄까지 반복한다.
  • i는 현재 줄 번호이다.

예를 들어 N = 5이면

  • i = 0 → 첫째 줄
  • i = 1 → 둘째 줄
  • i = 2 → 셋째 줄
  • i = 3 → 넷째 줄
  • i = 4 → 다섯째 줄

2단계: 한 줄을 저장할 문자열 준비

line = ""
  • 현재 줄에 들어갈 문자들을 차례대로 붙이기 위한 빈 문자열이다.

3단계: 한 줄의 각 칸 검사

for j in range(N):
  • 현재 줄의 왼쪽부터 오른쪽까지 한 칸씩 검사한다.
  • j는 현재 칸의 열 번호이다.

예를 들어 N = 5, i = 0이면 첫째 줄에서 j는 0, 1, 2, 3, 4를 차례대로 가진다.

4단계: 별을 찍을 위치 판별

if j == i or j == N - i - 1:

이 부분이 핵심이다.

X 모양은 대각선 2개로 이루어진다.

  • 왼쪽 위 → 오른쪽 아래 대각선: j == i
  • 오른쪽 위 → 왼쪽 아래 대각선: j == N - i - 1

즉, 현재 칸 (i, j)가 이 두 대각선 중 하나에 속하면 *을 넣는다.

예시: N = 5

각 줄에서 별이 들어가는 열 번호를 보면 다음과 같다.

  • i = 0일 때
    • j == 0
    • j == 5 - 0 - 1 = 4
    • 즉, 0번 칸과 4번 칸에 별
  • i = 1일 때
    • j == 1
    • j == 5 - 1 - 1 = 3
    • 즉, 1번 칸과 3번 칸에 별
  • i = 2일 때
    • j == 2
    • j == 5 - 2 - 1 = 2
    • 즉, 가운데 칸 하나만 별

그래서 결과가 다음처럼 된다.

i=0  *   *
i=1   * *
i=2    *
i=3   * *
i=4  *   *

5단계: 별 또는 공백 추가

line += "*"
  • 별 위치이면 *을 붙인다.
line += " "
  • 별 위치가 아니면 공백을 붙인다.

즉, 줄 전체를 한 글자씩 완성한다.

6단계: 오른쪽 공백 제거 후 출력

print(line.rstrip())
  • 줄 끝에 붙은 공백을 제거한 뒤 출력한다.
  • 문제에서 “마지막 별 뒤에는 공백을 출력하지 않는다”라고 했기 때문에 필요하다.

예를 들어 첫 줄이 내부적으로

"*   *"

이면 그대로 출력되지만,

어떤 줄이 내부적으로

"  *  "

처럼 끝에 공백이 있으면 rstrip()이 오른쪽 공백을 지워서

"  *"

로 출력한다.


2. 문법 설명

input()

N = int(input())
  • 한 줄을 문자열로 입력받는 함수
  • 사용 형태:
input()

int()

N = int(input())
  • 문자열을 정수로 변환하는 함수
  • 사용 형태:
int(값)

for문

for i in range(N):
  • 반복문을 실행할 때 사용한다.
  • 여기서는 행과 열을 차례대로 검사한다.
  • 사용 형태:
for 변수 in range(횟수):
    실행할 코드

range()

range(N)
  • 0부터 N-1까지의 정수를 만든다.
  • 사용 형태:
range(끝)

if 조건문

if j == i or j == N - i - 1:
  • 조건이 참이면 별을 넣고, 아니면 공백을 넣는다.
  • 사용 형태:
if 조건:
    실행할 코드
else:
    실행할 코드

or

j == i or j == N - i - 1
  • 두 조건 중 하나라도 참이면 전체를 참으로 만든다.
  • 사용 형태:
조건1 or 조건2

문자열 덧붙이기

line += "*"
  • 기존 문자열 뒤에 문자를 이어 붙인다.
  • 사용 형태:
문자열변수 += 추가할문자열

rstrip()

print(line.rstrip())
  • 문자열 오른쪽 끝의 공백을 제거한다.
  • 사용 형태:
문자열.rstrip()

print()

print(line.rstrip())
  • 값을 출력하는 함수
  • 사용 형태:
print(값)

3. 실수 포인트

j == N - i - 1 대신 j == N - i로 쓰는 경우

if j == i or j == N - i:
  • 인덱스는 0부터 시작하므로 오른쪽 대각선은 N - i - 1이어야 한다.

rstrip()을 빼는 경우

print(line)
  • 줄 끝 공백이 그대로 출력되어 출력 형식이 틀릴 수 있다.

if j == i and j == N - i - 1로 쓰는 경우

if j == i and j == N - i - 1:
  • 두 조건을 동시에 만족하는 경우는 가운데 한 칸뿐이므로 X 모양이 만들어지지 않는다.

line = ""를 바깥에서 한 번만 만드는 경우

line = ""
for i in range(N):
    for j in range(N):
        ...
  • 줄마다 초기화해야 하므로 line = ""는 바깥 반복문 안에 있어야 한다.

4. 핵심 정리

  • i는 행, j는 열로 생각하면 이해가 쉽다.
  • 현재 칸이 두 대각선 j == i 또는 j == N - i - 1에 있으면 별을 출력하면 된다.