본문 바로가기
Problem Solving/BOJ

[BOJ][Python]10994번 풀이

by NoiB 2022. 7. 21.
반응형

https://www.acmicpc.net/problem/10994

 

10994번: 별 찍기 - 19

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net

n = int(input())
line_len = 4*(n-1)+1
cnt = 1
stars = [['*' for _ in range(line_len)] for _ in range(line_len)]
while line_len - 2*cnt >= 1:
    for i in range(cnt, line_len-cnt):
        for j in range(cnt, line_len-cnt):
            if cnt%2 == 1:
                stars[i][j] = ' '
            else:
                stars[i][j] = '*'
    cnt += 1
for i in stars:
    print(''.join(i))

예전에 단계별로 풀어보기를 진행할 때 재귀에서 이 비슷한 문제를 풀었던 적이 있습니다. 그 때는 재귀 자체도 익숙하지 않을 때인데 이런 걸 시키니까 도통 할 줄 몰라서 풀이를 막 찾아보고 그냥 저냥 해결했던 기억이 있는데 드디어 이런 문제도 혼자서 해결하게 되는군요. 재귀는 아니지만요.

 

문제의 접근은 반복문과 조건문의 결합입니다. 처음에 형상을 봤을 때 도통 규칙이 뭔지 감이 안잡혀서 재귀로 일단 구현을 해볼까 하면서 잘라놓고 보니까 큰 틀 안에 숫자가 작은 경우가 들어있는 모양이더라구요. 그 뜻은 다른 건 딱히 할 필요없고 모든 경우에 대해서 큰 틀만 구현하면 된다는 뜻이되니까, 그렇다면 가득 채운 다음에 안에 있는 녀석들을 다 비우면 되겠다고 생각했습니다. 다만 그렇게 될 경우에 언제 비우고 언제 채울지를 정하기 어렵죠. 그래서 현재의 상태를 나타내면서 반복문의 범위에 대한 변수인 cnt를 선언해서 cnt가 홀수라면 비우고, 짝수라면 채우는 것으로 코드를 작성했습니다(맨 처음에 채울 때가 0 이기 때문). 그러고 나니까 쉽게 해결할 수 있었네요. 반대로 재귀라면 이거랑 똑같이 하되 cnt가 딱히 상태에 대한 변수가 아니어도 무방하겠죠. 변수를 줄이면서 재귀 호출을 하고 채우기 한 번, 빼기 한 번으로 이중 반복문을 두 개, 범위는 다르게 해서 작성하시면 위와 비슷하지만 재귀의 형태로 짤 수 있을 것 같네요.

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]15663번 풀이  (0) 2022.07.23
[BOJ][Python]11725번 풀이  (0) 2022.07.22
[BOJ][Python]11053번 풀이  (0) 2022.07.21
[BOJ][Python]10157번 풀이  (0) 2022.07.20