happyso
study with happyso
happyso
전체 방문자
오늘
어제
  • 분류 전체보기 (302)
    • GIT (3)
    • 컴퓨터 기본 개념 (29)
    • 알고리즘 (125)
      • 알고리즘 문제 (115)
      • 알고리즘 개념 (10)
    • Go (2)
    • 클라우드 (54)
      • DevOps (4)
      • Kubernetes(쿠버네티스) (33)
      • AWS (6)
      • CKA (8)
    • 리눅스(Linux) (18)
      • 컨테이너(Container) (8)
    • Front (22)
      • JavaScript (2)
      • React (20)
    • Python (21)
      • Python 웹 크롤링 (11)
      • Django (7)
      • MachineLearning (3)
    • 데이터베이스 (6)
      • MariaDB (2)
      • MongoDB (4)
    • C언어 (5)
    • Trouble Shooting (2)
    • 네트워크 (8)
      • CCNA (5)
    • 보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 18
  • edit
  • Patch
  • replace
  • apply
  • kubernetes
  • 15

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
happyso

study with happyso

[python] 백준 > 분할정복, 재귀 > Z(1074)
알고리즘/알고리즘 문제

[python] 백준 > 분할정복, 재귀 > Z(1074)

2021. 2. 19. 01:38

[문제]

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다.

만약, N > 1이 라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 크기가 2N-1 × 2N-1로 4등분 한 후에 재귀적으로 순서대로 방문한다.

다음 예는 22 × 22 크기의 배열을 방문한 순서이다.

N이 주어졌을 때, r행 c열을 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오.

다음은 N=3일 때의 예이다.

입력

첫째 줄에 정수 N, r, c가 주어진다.

출력

r행 c열을 몇 번째로 방문했는지 출력한다.

제한

  • 1 ≤ N ≤ 15
  • 0 ≤ r, c < 2N

www.acmicpc.net/problem/1074

 

1074번: Z

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, N > 1이 라서

www.acmicpc.net

[풀이]

import sys
input = sys.stdin.readline

n, r, c = map(int, input().split())

# n: 변의 길이,x: 현재 위치의 x축 값, y:현재 위치의 y축 값
result = 0
def N(n, x, y):
    global result

    if x==r and y==c:
        print(int(result))
        exit(0)

    if n == 1:
        result += 1
        return

    if not(x<=r<x+n and y<=c<y+n):
        result += n*n
        return

    # 1사분면
    N(n/2, x, y)
    # 2사분면
    N(n/2, x, y+n/2)
    # 3사분면
    N(n/2, x+n/2, y)
    # 4사분면
    N(n/2, x+n/2, y+n/2)

N(2**n, 0, 0)
  • 재귀함수에대해 완전히 이해할 수 있는 문제였다.
  • 4개씩 쪼개서 (r,c)가 있는 위치가 아니라면 나머지 3분면에 있는 갯수를 다 더해준다.
  • 그리고 (r,c)가 존재하는 분면을 다시 4등분해서 똑같이 탐색한다.
  • 총 4개의 정사각형만 남았을 때, 정사각형 한개씩 탐색을 해서 (r,c)가 아니라면 1만 더해주고 리턴한다.
  • (r,c)가 있는 곳까지 왔을 때, 지금까지 더해준 result를 출력해준다.

'알고리즘 > 알고리즘 문제' 카테고리의 다른 글

[python] 백준 > 수학, 사칙연산 > 알람 시계(2884)  (0) 2021.02.20
[python] 백준 > 문자열, 구현 > 팰린드롬수(1259)  (0) 2021.02.19
[python] 백준 > 이분 탐색 > 입국심사(3079)  (0) 2021.02.17
[python] 백준 > 시뮬레이션, 구현 > 로봇 청소기(14503)  (0) 2021.02.17
[python] 백준 > 부루트포스 > 체스판 다시 칠하기(1018)  (0) 2021.02.16
    '알고리즘/알고리즘 문제' 카테고리의 다른 글
    • [python] 백준 > 수학, 사칙연산 > 알람 시계(2884)
    • [python] 백준 > 문자열, 구현 > 팰린드롬수(1259)
    • [python] 백준 > 이분 탐색 > 입국심사(3079)
    • [python] 백준 > 시뮬레이션, 구현 > 로봇 청소기(14503)
    happyso
    happyso

    티스토리툴바