새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 14600 샤워실 바닥 깔기

by 언호 2022. 1. 8.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

안쪽으로 영역을 나누어서 타일을 설치해야하므로 분할정복으로 접근했습니다.

2) 알고리즘

  • 분할정복

3) 풀이 코드

사용 언어 - Python

import sys

def solution(r, c, k, area):                        # 시작 좌표, 제곱 수, 구역
    global num

    if k <= 1:                                      # 가장 안쪽 단계이면
        cnt = 3                                     # ㄱ자 모양 타일은 3개만 채워야 하므로
        if area == 0 or area == 4:                  # 왼쪽 위와 가운데 영역
            for i in range(r, r+2):                 # 위에서 아래, 왼쪽에서 오른쪽
                for j in range(c, c+2):
                    if not board[i][j] and cnt:
                        board[i][j] = num
                        cnt -= 1
        elif area == 1:                             # 오른쪽 위에 영역
            for i in range(r, r+2):                 # 위에서 아래, 오른쪽에서 왼쪽
                for j in range(c+1, c-1, -1):
                    if not board[i][j] and cnt:
                        board[i][j] = num
                        cnt -= 1
        elif area == 2:                             # 왼쪽 아래 영역
            for i in range(r+1, r-1, -1):           # 아래에서 위, 왼쪽에서 오른쪽
                for j in range(c, c+2):
                    if not board[i][j] and cnt:
                        board[i][j] = num
                        cnt -= 1
        elif area == 3:                             # 오른쪽 아래 영역
            for i in range(r+1, r-1, -1):           # 아래에서 위, 오른쪽에서 왼쪽
                for j in range(c+1, c-1, -1):
                    if not board[i][j] and cnt:
                        board[i][j] = num
                        cnt -= 1
        num += 1
        return
    
    solution(r, c, k-1, 0)                          # 각 영역으로 재귀, 분할정복
    solution(r, c + 2**(k-1), k-1, 1)
    solution(r + 2**(k-1), c, k-1, 2)
    solution(r + 2**(k-1), c + 2**(k-1), k-1, 3)
    solution(r + 2**k//4, c + 2**k//4, k-1, 4)



K = int(sys.stdin.readline())                       # 제곱수
X, Y = map(int, sys.stdin.readline().split())       # 하수구 구멍의 좌표
board = [[0] * 2**K for _ in range(2**K)]           # 샤워실 바닥
board[2**K - Y][X - 1] = -1                         # 하수구 구멍 -1 표시

num = 1                                             # 타일 번호

solution(0, 0, K, 0)                                # 분할정복 시작

for row in board:                                   # 출력
    for col in row:
        print(col, end=' ')
    print()

📝 결과 및 학습한 내용

1) 어려웠던 내용

특별히 없습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

- https://www.acmicpc.net/problem/14600

 

14600번: 샤워실 바닥 깔기 (Small)

첫 번째 줄에는 바닥의 한 변의 길이를 표현하는 자연수 K(1 ≤ K ≤ 2) 가 주어진다. 이때 바닥의 크기는 2K 가 됨에 유의하라. 두 번째 줄에는 배수구의 위치를 나타내는 자연수 x, y (1 ≤ x, y ≤ 2K)

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

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

[프로그래머스] 수식 최대화  (0) 2022.01.10
[프로그래머스] 후보키  (0) 2022.01.09
[백준] 17141 연구소2  (0) 2022.01.07
[백준] 1865 웜홀  (0) 2022.01.06
[백준] 11657 타임머신  (0) 2022.01.05

댓글