문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
아이디어
이런 모양이 총 9번 반복되는데 가운데는 뻥 뚫려있게 되는 구조로 이해할 수 있다.
배열의 인덱스를 기준으로 위에서 아래로 사고해보자.
이를 일단 단순한 재귀적 코드로 보면 다음과 같이 된다.
star = ["***","* *","***"]
star2 = [star[0]*3,star[1]*3,star[2]*3 #첫째줄(1~3행)
,star[0]+" "*3+star[0],star[1]+" "*3+star[1],star[2]+" "*3+star[2] #둘째줄(4~6행)
,star[0]*3,star[1]*3,star[2]*3] #셋째줄(7~9행)
star3 = [star2[0]*3,star2[1]*3,star2[2]*3,star2[3]*3,star2[4]*3,star2[5]*3,star2[6]*3,star2[7]*3,star2[8]*3
,star2[0]+" "*9+star2[0],star2[1]+" "*9+star2[1],star2[2]+" "*9+star2[2],star2[3]+" "*9+star2[3],star2[4]+" "*9+star2[4],star2[5]+" "*9+star2[5],star2[6]+" "*9+star2[6],star2[7]+" "*9+star2[7],star2[8]+" "*9+star2[8]
,star2[0]*3,star2[1]*3,star2[2]*3,star2[3]*3,star2[4]*3,star2[5]*3,star2[6]*3,star2[7]*3,star2[8]*3]
for i in star:
print(i)
print("---------------------")
for i in star2:
print(i)
print("---------------------")
for i in star3:
print(i)
따라서 위의 아이디어를 일반화하여 함수로 만들면 다음과 같은 코드를 작성할 수 있다.
정답코드
#별 찍기 - 10
def count_star(a : list):
unDeterminedStar = []
for i in range(3*len(a)):
if(i//len(a) == 1):
unDeterminedStar.append(a[i%len(a)]+" "*len(a)+a[i%len(a)])
else:
unDeterminedStar.append(a[i%len(a)]*3)
return unDeterminedStar
#3일 때
star = ["***","* *","***"]
N = int(input())
T = 0
while N != 3:
N = N//3
T += 1
#T값을 통해 재귀함수를 몇번 돌릴지 체크해준다. 9 -> 1 번 27 -> 2번 81 -> 3번
for i in range(T):
star = count_star(star)
for i in star:
print(i)
Q) if(i//len(a) == 1): 라는 조건문은 왜 들어간 건가요?
중간에 비어있는 부분의 예외를 체크하기 위해 들어간 조건문입니다.
처음에 풀지못한 이유
머리속으로는 어떻게 접근해야할지 알았으나, 배열을 어떻게 사용해야하는지 등에 어려움을 겪었음. 따라서 답안을 바로봄
배운점
1.배열을 활용하는 방법을 알게 되었다.
star = ["***","* *","***"]
for i in star:
print(i)
2.파이썬3에서 화살표 함수
def funName(x: str, y: float = 6.5) -> int:
return x + y
value = funName(3)
print(value)
위와같은 예제가 있다고 했을 때
함수명 : def 다음에 나와있는 funName
x : str 콜론(:) 다음에 적어주는 것은 매개변수에 할당되는 형식
y : float = 6.5 초기값을 콜론다음에 해당 형식 뒤에 = 하고 값을 적어줄 수 있다. (변수 : 형식 = 기본값)
-> int : 이 함수가 반환해주는 값의 형식이 int라는 것을 말함
3.문제의 조건에서 힌트를 항상 얻자.
문제
재귀적인 패턴 -> 재귀함수 사용
4.특정 조건(여기에선 제곱수) 따른 오름차수를 계산할 때 사용하는 코드
T = 0
while N != 3:
N = N//3
T += 1
'CS > 알고리즘' 카테고리의 다른 글
백준 2798번 블랙잭 파이썬 풀이 (0) | 2022.02.19 |
---|---|
백준 11729 하노이 탑 이동 순서 파이썬 풀이 (0) | 2022.02.15 |
백준 1002번 터렛 파이썬 풀이 (0) | 2022.02.09 |
백준 2581번 소수 파이썬 풀이 (0) | 2022.02.07 |
백준 3053번 택시 기하학 파이썬 풀이 (0) | 2022.02.06 |