이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

백준 2448(별 찍기) - Python(파이썬) - 재귀

  • 2022.06.03 18:48
  • [백준] Python,Java로 풀기📖
    반응형
     

    2448번: 별 찍기 - 11

    첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

    www.acmicpc.net

     

    문제 설명

    내가 처음 생각한 풀이는 이와 같다

    위와 같이 삼각혁의 꼭짓점의 좌표를 (startX,startY,높이) 라고 가정해본다.

    N=12 일 때의 삼각형은 연두색과 같이 세개로 나누어진다.

    ( 0, 0 6 ) , ( -6, 6, 6 ) ,( 6, 6, 6 )으로 이렇게 세개가 나누어진다. 

    이걸 처음 시작점 ( 0, 0, 12) 점이랑 연관되어서 생각해보면 ( 0, 0, 6 ), ( 0-6, 0+6, 6 ), ( 0+6, 0+6, 6) 이라고 할 수 있다.

    또 N = 6일 때의 값을 각각 세개의 삼각형으로 나눌 수 있다.

    ( 0 , 0 , 6 ) -> ( 0, 0, 3 ) , ( -3, 3, 3 ) , ( 3, 3, 3 )  -> ( 0, 0, 3) , ( 0-3, 0+3, 3) , ( 0-3, 0+3, 3)

    ( -6, 6, 6 ) -> ( -6, 6, 3) , ( -9, 9 , 3) , ( -3, 9, 3 ) -> ( -6, 6, 3 ) , ( -6-3, 6+3, 3) , (-6+3, 6+3, 3)

    ( -6, 6, 6 ) -> ( 6, 6 ,3) , ( 3, 9,3 ) , ( 9, 9, 3) -> ( 6, 6, 3 ), ( 6-3, 6+3, 3), ( 6+3, 6+3, 3)

    즉, ( startX, startY, N )
    => ( startX, startY, (N//2) ), ( startX-(N//2) , startY+(N//2) , (N//2) ) , ( startX+(N//2) , startY+(N//2) , (N//2) )

     이런식으로 재귀한다는 것이다. 

    그리고 계속 2로 나누다가 3이 되는 순간에는 

      i=-2 i=-1 i=0 i=1 i=2
    j=0     O    
    j=1   O   O  
    j=2 O O O O O

    j = 0 인 경우에는 i=0일 때만 성립한다.

    j = 1 인 경우에는 i=-1 또는 i=1인 경우 성립한다.

    j= 2 인 경우에는 모두 성립한다.

    문제풀이
    ① 함수를 star(startX, startY, n , k ) 이렇게 선언했다.
    startX 시작 x좌표, startY 시작 y좌표, n : 길이, k : 처음 n의 길이 저장용
    k를 따로 저장한 이유는 n은 계속 변하기 때문에 따로 저장해야하는 k가 필요하여서 이런식으로 정리하였다. 
    ( k가 필요한 이유 ? 제일 큰 삼각형 위의 꼭짓점을 (0,0)이라고 가정하였는데 실제적으로 배열에서는 (k-1,0)이므로 나중에 계산 시 필요하여서 ) 
    ② nextn = n//2라고 가정 n==3인 경우를 제외하고
    star(starX,startY,nextN,n,k), star(startX+nextn,start+nextn,n,k ), star(startX-nextn, startY+nextn, n, k) 을 한다.
    ③ n==3인 경우에는 for 루프로 i는 -2부터 2까지, j는 0부터 2까지 하지만 
     j==0인 경우 -> i==0 | j==1 -> i==1 , i==-1 | j==2인 경우에는 array[startY+j][startX+i+k-1 ] ="*"를 하게 한다.
    ( 이 때, 1번에서 말했듯이 옮겨야하므로 k-1를 더해주는 것이 중요하다 ) 
    import sys
    n = int(sys.stdin.readline())
    #array 선언 ( 2n-1 * n 구조 )
    array = [[" "]*(2*n-1) for _ in range(n)]
    
    def star(startX,startY,n,k):
        #n==3인 경우
        if n == 3:
            for i in range(-2, 3, 1):
                for j in range(3):
                    if (i == 0 and j == 0) or (j == 1 and i == -1) or (j == 1 and i == 1) or (j == 2):
                        array[startY + j][startX + i + k - 1] = "*"
            return
        #n==3이 아닌 경우
        else:
            #길이를 나누고
            nextn = n//2
            star(startX,startY,nextn,k)
            star(startX+nextn,startY+nextn,nextn,k)
            star(startX-nextn,startY+nextn,nextn,k)
    
    #처음 스타트 점을 원점이라고 가정
    star(0,0,n,n)
    #프린트
    for i in array:
        print("".join(i))

     

    반응형

    '[백준] Python,Java로 풀기📖' 카테고리의 다른 글

    백준 6603(로또) - Python(파이썬),Java(자바)- 백트래킹  (0) 2022.06.16
    백준 1991(트리 순회) - Python(파이썬) - 트리,재귀  (0) 2022.06.03

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • 백준 6603(로또) - Python(파이썬),Java(자바)- 백트래킹

      백준 6603(로또) - Python(파이썬),Java(자바)- 백트래킹

      2022.06.16
    • 백준 1991(트리 순회) - Python(파이썬) - 트리,재귀

      백준 1991(트리 순회) - Python(파이썬) - 트리,재귀

      2022.06.03
    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (168)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (25)
        • (운영체제) - 블로그 및 강의 참고 (0)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
      • 까먹을까봐 적는 것들 (4)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • 오블완
    • 프로그래머스
    • 티스토리챌린지
    • 백준
    • 99클럽
    • 코딩테스트준비
    • 항해99
    • TiL

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바