[Python] 2133 - 타일 채우기 (골드4)

2022. 6. 26. 12:17·Coding Test/Solution

1. 문제 설명

https://www.acmicpc.net/problem/2133

 

2133번: 타일 채우기

3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자.

www.acmicpc.net

실버의 타일링(BOJ - 1793) 문제를 풀어봤다면 쉽게 해결할 수 있는 문제


2. 아이디어

어느정도 패턴 분석이 될 때까지는 노가다를 해봐야 하는 문제다.

N이 홀수인 경우에는 절대 타일을 모두 채울 수 없으므로 0을 출력 후 프로그램을 종료하면 된다.

그럼 결국 남는 경우의 수는 N이 짝수인 경우일 뿐인데

 

N이 2, 4 정도는 직접 세볼 수 있지만 6만 넘어가도 41가지 경우가 나온다.

처음에 규칙성을 찾기가 굉장히 힘들지만 표를 그려서 색칠해보면 이해하기 쉽다.

       
       
       

2x3 블럭이 만나면 접선에 가로로 블럭을 놓은 이러한 형태의 타일이 나오면서

점화식이 조금 복잡해지는 건데 직접 해보면 감을 잡을 수 있다.

 

N이 8인 경우를 생각해보자.

이 경우는 N이 6인 케이스에서 2x3 타일이 더 들어왔다고 봐도 무방하다.

따라서 처음은 cache[6] x cache[2]

그리고 이번에 위에서 언급한 새롭게 고려해주어야 할 형태의 타일이 나오는데

저 사이에는 무조건 가로로 타일이 놓여져야한다. (그래야 4x3 타일이 온전히 채워진다.)

특수한 형태의 타일이 오른쪽에 놓이느냐, 왼쪽에 놓이느냐에 따라

경우의 수가 2개로 갈라지므로 cache[6] x 2가 된다.

위의 경우와 똑같다.

좌, 우의 경우를 고려하여 cache[2] x 2의 경우가 나온다.

그리고 가장 마지막 형태인데, 이때는 가로로 놓인 타일이 위쪽으로 올라가는 경우가 존재하므로

고정적으로 2라는 값이 나온다.

 

이 일련의 과정을 보면 dp를 사용하여 결과를 구하는 것은 총 3가지 과정으로 나눌 수 있다.

  1. N-2 경우의 수에 2x3 크기의 타일이 추가된 경우 고려
  2. 4부터 N-2까지 모든 경우에 2를 곱하여 경우의 수에 더함
  3. 최종적으로 2를 더함

놀랍게도 이 문제는 이게 다였다. 그다음은 반복문 조건을 잘 걸어가며 돌려주면 끝나는 문제.

 


3. 코드

cache = [0] * 31

def solution():
    n = int(input())
    cache[2], cache[4] = 3, 11
    if n % 2 == 1:
        print(0)
        return
    
    for i in range(6, 31, 2):
        cache[i] = cache[i - 2] * cache[2]
        for j in range(4, i, 2):
            cache[i] += 2 * cache[i - j]
        cache[i] += 2
    print(cache[n])
    
solution()
저작자표시 비영리 (새창열림)
'Coding Test/Solution' 카테고리의 다른 글
  • [Python] 1629 - 곱셈 (실버1)
  • [Python] 1022 - 소용돌이 예쁘게 출력하기 (골드4)
  • [Python] 1788 - 피보나치 수의 확장 (실버3)
  • [Python] 2636 - 치즈 (골드4)
나죽못고나강뿐
나죽못고나강뿐
싱클레어, 대부분의 사람들이 가는 길은 쉽고, 우리가 가는 길은 어려워요. 우리 함께 이 길을 가봅시다.
  • 나죽못고나강뿐
    코드를 찢다
    나죽못고나강뿐
  • 전체
    오늘
    어제
    • 분류 전체보기 (450) N
      • Computer Science (59)
        • Git & Github (4)
        • Network (17)
        • Computer Structure & OS (13)
        • Software Engineering (5)
        • Database (9)
        • Security (4)
        • Concept (7)
      • Frontend (21)
        • React (13)
        • Android (4)
        • iOS (4)
      • Backend (74)
        • Spring Boot & JPA (47)
        • Django REST Framework (14)
        • MySQL (8)
        • Nginx (1)
        • FastAPI (4)
      • DevOps (24)
        • Docker & Kubernetes (11)
        • Naver Cloud Platform (1)
        • AWS (2)
        • Linux (6)
        • Jenkins (0)
        • GoCD (3)
      • Coding Test (112)
        • Solution (104)
        • Algorithm (7)
        • Data structure (0)
      • Reference (134)
        • Effective-Java (90)
        • Pragmatic Programmer (0)
        • CleanCode (11)
        • Clean Architecture (2)
        • Test-Driven Development (4)
        • Relational Data Modeling No.. (0)
        • Microservice Architecture (2)
        • 알고리즘 문제 해결 전략 (9)
        • Modern Java in Action (0)
        • Spring in Action (0)
        • DDD start (0)
        • Design Pattern (6)
        • 대규모 시스템 설계 (6)
        • JVM 밑바닥까지 파헤치기 (4)
      • Service Planning (2)
      • Side Project (5)
      • AI (0)
      • MATLAB & Math Concept & Pro.. (1)
      • Review (15) N
      • Interview (1)
      • IT News (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃
  • 공지사항

    • 취업 전 계획 재조정
    • 취업 전까지 공부 계획
    • 앞으로의 일정에 대하여..
    • 22년 동계 방학 기간 포스팅 일정
    • 중간고사 기간 이후 포스팅 계획 (10.27~)
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
나죽못고나강뿐
[Python] 2133 - 타일 채우기 (골드4)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.