61~64번에서 별을 열심히 찍었었다. 이제 별 찍기 예제의 마지막 X 모양 별 찍기를 해보려고 한다.

2023.08.18 - [BOOK/파이썬 문제풀이 100] - 62. 대각선 별 찍기

 

62. 대각선 별 찍기

별 찍기의 응용은 참 많은 것 같다. 61번에서 기초적인 별 찍기를 했으니 살짝 응용한 대각선 별 찍기도 해보자. 2023.08.18 - [BOOK/파이썬 문제풀이 100] - 61. 삼각형 별 찍기 I 61. 삼각형 별 찍기 I 이

jijibae.tistory.com


문제

다음과 같이 *를 출력하는 코드를 for 반복문을 사용해 작성하세요.

 

접근

총 행의 수는 10이므로 바깥 for문의 반복 횟수는 10번이다.

열에서 처음부터 별까지의 빈칸의 수는 1행 => 0 , 2행 => 1, ... ,5행 => 4, 6행 =>4, 7행 => 3, ... , 10행 =>0이므로

+1씩 등차수열을 띄고, 7행부터 -1씩 등차수열을 띄니 조건문을 달아야 한다고 생각했다.

대칭이 많이 보이므로, 한쪽만 잘 구현해놓으면 반대쪽은 쉽게 할 수 있을 것이다.

j = 1
for i in range(10):
    if i == 5 : i = 4
    if i > 5: 
        i = i - (2*j+1)
        j += 1
    print(' ' * i, end="")
    print('*' * 1 , end="")
    print(' ' * (8-2*i), end="")
    print('*' * 1, end="")
    print(' ' * i,)

위 풀이는 이중 for문을 사용하지 않고.. 꾸역꾸역 어떻게든 해보겠다는 나의 의지가 잘 담겨 있다..

결과는 동일하게 나오지만 배울만한 내용은 없어 더 고민해보았다.

 

별이 언제 찍힐까?

62번의 대각선 별 찍기를 기억해보면 행과 열의 인덱스가 같은 경우 별이 찍힌다.

이 예제의 X 문자중 \ 부분은 행,열의 인덱스가 같은 부분이다.

 

그럼 / 부분은 어떻게 찍을 수 있을까??

바로 인덱스의 합이다. 행과 열의 인덱스의 합이 9일 때 별이 찍힌다고 생각할 수 있다.

X 문자에서 \부분
X 문자에서 / 부분

i + j 의 값이 9일 때 별이 찍힌다는 규칙을 알면 이 문제를 쉽게 풀 수 있다.

for i in range(10):
    for j in range(10):
        if i == j or i + j == 9:
            print('*', end="")
        else:
            print(' ', end="")
    print()

결과

인덱스의 합도 고려할 수 있는 좋은 문제였다고 생각한다.