파이썬 알고리즘 115 번 | [백준 2447번] - 재귀가 참 어렵네 - 다시 풀자 !

Yunny.Log ·2022년 2월 5일
0

Algorithm

목록 보기
118/318
post-thumbnail

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라는 것을 말한다!

0개의 댓글