김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • GitHubDesktop
  • 원격저장소
  • Remote저장소
  • ㄱ
  • KMU_WINK
  • 깃허브데스크탑
  • local저장소
  • 로컬저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[백준-1074] Z 파이썬 풀이
•알고리즘(Algorithm )/문제풀이

[백준-1074] Z 파이썬 풀이

2022. 8. 8. 03:09

# 문제

 

# 풀이

만약 내가 찾아야하는 곳이 (7,7)의 위치면 위의 그림과 같이 된다. 주어진 정사각형은 4등분으로 구역을 나누며 Z모양을 그린다. 

이점에 주목해서 문제를 풀었다. 총 4개의 사분면으로 나누고, 현재 함수의 스택이 제 3사분면에 위치했다면, 0,1,2 사분면까지의 개수를 더해준 후, 좌표의 범위를 한단계 밑으로 축소해준다. 아래 그림을 봐보자. 문제풀면서 쓱쓱 그린거라 이쁘지는 않다..!

현재 구해야 하는 곳이 N=4, row=12, col=14라면 0~3사분면까지의 길이 + 함수(row=4,col=6)으로 다운스케일링이 가능 할 것이다. 그렇게 N=1 일때까지 함수를 호출해준다.

# 코드

import sys

def z(n,row,col):
  if n == 1:
    if row == 0 and col == 0 :
      return 0
    if row == 0 and col == 1 :
      return 1
    if row == 1 and col == 0 :
      return 2
    if row == 1 and col == 1 :
      return 3
  before_size = 2**(n-1)

  if row < before_size and col < before_size :
    count = 0
    # print(f"제 0사분면 {n}, {row}, {col}")
  elif row < before_size and col >= before_size :
    count = 1
    col -= before_size
    # print(f"제 1사분면 {n}, {row}, {col}")
  elif row >= before_size and col < before_size :
    count = 2
    row -= before_size
    # print(f"제 2사분면 {n}, {row}, {col}")
  else :
    count = 3
    row -= before_size
    col -= before_size
    # print(f"제 3사분면 {n}, {row}, {col}")
  return (count*before_size**2) + z(n-1,row,col)

def solve():
  n,row,col = map(int,sys.stdin.readline().strip().split())
  answer = z(n,row,col)
  print(answer)

if __name__ == '__main__':
    solve()

count함수는 각각의 4분면일때 몇개의 블럭인지를 계산하기 위해 사용했다.

즉 핵심 요지는, 앞에 블럭 + 함수(다운사이징 시켜 다시 조절한 좌표) 를 재귀적으로 호출 하는 풀이다.

# 마치며



재귀함수를 쓸때는 뭔가 반복적으로 일어나는 일이 있는지를 잘 찾아야 한다고 느꼈다.

저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준-2751] 수 정렬하기2 파이썬  (0) 2022.08.09
[백준-7490] 0만들기 파이썬  (0) 2022.08.08
[백준-2747] 피보나치 수 파이썬, 재귀함수 시간초과 메모이제이션 방법사용  (0) 2022.08.08
[백준-10989] 수 정렬하기3 파이썬, 계수정렬  (0) 2022.08.07
[백준-1427] 소트 인사이드 파이썬  (0) 2022.08.07
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준-2751] 수 정렬하기2 파이썬
    • [백준-7490] 0만들기 파이썬
    • [백준-2747] 피보나치 수 파이썬, 재귀함수 시간초과 메모이제이션 방법사용
    • [백준-10989] 수 정렬하기3 파이썬, 계수정렬
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바