파이썬 알고리즘 115 번 | [백준 2447번] - 재귀가 참 어렵네
115. 별 찍기 - 10
1) 어떤 전략(알고리즘)으로 해결?
1) 입력값이 3일 때
2) 입력값이 9일 때
3) 입력값이 27일 때
=> 한 칸을 차지하는 아기가 계속해서 누적돼서 전달됨을 캐치해야 한다
<내 풀이> (feat : 시행착오)
- 사실상 밑에 올린 다른 분의 코드를 암기해서 작성
- 훗날 2회독을 하게 되면 다른 방법 강구 예정..
(1) 처음 암기 & 쳤을 때 오류
def star(n:int, arr:list) -> list:
accum =[]
if n==3 :
return arr
else :
for i in arr:
accum.append(i)
for i in arr:
accum.append(i)
for i in arr:
accum.append(i)
return (n//3, accum)
if __name__ == "__main__" :
n=int(input())
defautvalue = ["***", "* *", "***"]
res = star(n, defautvalue)
for i in res :
print(i)
=> append(i) 가 아니고 append(i*3)
로 늘려줘야 한다
- 3배씩 늘리지 않고 i 만 단순히 붙이게 되면 달라질 것이 없음 ..
- 그리고 가운데 아이는 i i i 형태로 그 전의 칸이 오는 것이 아니고
- 가운데를 빈칸으로 놔둔 형태로 자리잡게 되니깐 빈칸으로 중간에 남겨두어야 한다
(2)
def star(n:int, arr:list) :
accum =[]
if n==3 :
return arr
else :
for i in arr:
accum.append(i*3)
for i in arr:
accum.append(i+(' ')*(n//3)+i)
for i in arr:
accum.append(i*3)
return (n//3, accum)
if __name__ == "__main__" :
n=int(input())
defautvalue = ["***", "* *", "***"]
res = star(n, defautvalue)
if n==3 :
for i in res :
print(i)
else :
for i in res[1] :
print(i)
- 27부터 이상해짐
- 9 까지는 accum이 잘 누적되는데
=> 27, 81에서는 더 나아가지 않고 자꾸 하나만 나누면 바로 return 돼버림
=> 여기서 내가 n을 잘근잘근..자르고 있었삼 ㅠㅠ
=> 이 부분을 len(arr)로 판단해줘야지 n을 3으로 갱신시키고 있으면 안되는 거였삼~
------> 엥 근데 위에거 고쳐도 똑같은디!?
=> 어디서 왜 반환처리를 해버리는고지!?!?!?
def star(n:int, xr:list)->list :
accum =[]
if n == 3 :
return xr
else :
for i in xr:
accum.append(i*3)
for i in xr:
accum.append(i+(' ')*(len(xr))+i)
for i in xr:
accum.append(i*3)
return (n//3, accum)
if __name__ == "__main__" :
n=int(input())
defautvalue = ['***', '* *', '***']
res = star(n, defautvalue)
if n==3 :
for i in res :
print(i)
else :
print(res)
for i in range(res[0]) :
for j in res[1] :
print(j)
<다른 분의 풀이 or 내 틀린 풀이, 문제점>
(1) 안되던 코드
k=int(input())
def star(n) :
if n==0 :
return("***\n")
if n==1 :
return ("* *\n")
if n==2 :
return("***\n")
return star(n-1)+star(n-2)+star(n-3)
print(star(k))
(2) 다른 분의 설명 참고
출처1: https://study-all-night.tistory.com/5
출처2: https://imgzon.tistory.com/37
def star(n: int, x: list)-> list:
out = [] # 한번 처리한 값
if n == 3:
return x
else:
for i in x: # 위에 처음 3개의 구역
out.append(i*3)
for i in x: # 가운데 3개의 구역 (중앙 비어있음)
out.append(i+' '*len(x)+i)
for i in x: # 마지막 3개의 구역
out.append(i*3)
return star(n//3, out)
if __name__ == "__main__":
n = int(input())
first = ['***', '* *', '***']
final = star(n, first)
for i in final:
print(i)
<반성 점>
***
* *
***
라는 형태가 계속해서 누적된다는 포인트를 캐치했으면 좋았을텐데
이를 캐치하지 못했던 점이 아쉽다.
이 누적되는 아이가 다음 순서의 한칸을 차지하는 것이기 때문에 이 친구도 재귀함수에 같이 넘겨주어야 하는 것이다.
- 파이썬에서 함수를 선언할 때내가 넘길 것을
자료형 : 변수명
으로 선언하면 넘기기 가능이다
<배운 점>
1)
https://hyoje420.tistory.com/45
https://dojang.io/mod/page/view.php?id=2448
if __name__ == "__main__" 의 의미
=> 'name이라는 변수의 값이 main이라면 아래의 코드를 실행하라.'
- if name=="main"이라는 조건문을 넣어주고 그 아래는 직접 실행시켰을 때만 실행되길 원하는 코드들을 넣어주는 것
==>if __name__ == '__main__'
: #프로그램의 시작점일 때만 아래 코드 실행
2)
아래 설명 출처 : https://okdolmin.tistory.com/26
def funName(x: str, y: float = 6.5) -> int:
return x + y
value = funName(3)
print(value)
- x : str 콜론(:) 다음에 적어주는 것은 매개변수에 할당되는 형식을 말한다.
- y : float = 6.5 초기값을 콜론다음에 해당 형식 뒤에 = 하고 값을 적어줄 수 있다. (변수 : 형식 = 기본값)
-> int : 이거의 뜻은 이 함수가 반환해주는 값의 형식이 int라는 것을 말한다!
Author And Source
이 문제에 관하여(파이썬 알고리즘 115 번 | [백준 2447번] - 재귀가 참 어렵네), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@myway00/파이썬-알고리즘-115-번-백준-번저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)