헬창 개발자

백준 14712번 넴모넴모 (Easy) : 파이썬 본문

알고리즘

백준 14712번 넴모넴모 (Easy) : 파이썬

찬배 2021. 12. 31. 16:04

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

 

14712번: 넴모넴모 (Easy)

네모는 뿌××× 게임에 깊은 감명을 받아, 직사각형 모양의 격자판과 “넴모”라는 수수께끼의 생물을 이용하는 “넴모넴모”라는 게임을 만들었다. 이 게임의 규칙은 아주 간단하다. 격자판의

www.acmicpc.net

문제

네모는 뿌××× 게임에 깊은 감명을 받아, 직사각형 모양의 격자판과 “넴모”라는 수수께끼의 생물을 이용하는 “넴모넴모”라는 게임을 만들었다. 이 게임의 규칙은 아주 간단하다. 격자판의 비어 있는 칸을 임의로 골라 “넴모”를 하나 올려놓거나, “넴모”가 올라간 칸 네 개가 2 × 2 사각형을 이루는 부분을 찾아 그 위에 있는 “넴모”들을 모두 없애는 것을 질릴 때까지 반복하면 된다.

하지만 안타깝게도 게임은 정말 재미가 없었고, 네모는 아주 빨리 질려 버리고 말았다. 실망한 네모는 게임을 적당히 플레이하다가, “넴모”를 없애고 싶은데 격자판 위에 없앨 수 있는 “넴모”가 없으면 게임을 그만두기로 했다. 네모가 게임을 그만두었을 때 나올 수 있는 “넴모”의 배치의 가짓수를 구하여라.

입력

첫 번째 줄에 격자판의 행의 개수 N, 열의 개수 M(1 ≤ N, M ≤ 25, 1 ≤ N × M ≤ 25)이 공백으로 구분되어 주어진다.

출력

첫 번째 줄에 주어진 격자판에서 나올 수 있는, “넴모”들이 올라간 칸이 2 × 2 사각형을 이루지 않는 모든 배치의 가짓수를 출력한다.

설계

원래 direct = [[0,0],[1,0],[0,1],[1,1]] 방향 벡터를 사용할려다가 더 좋은걸 찾아서 수정했다.

좌표 (y, x) = (cnt // X, cnt % X)

N, M = map(int, input().split()) 을 사용하면 시간초과

python으로 제출하면 시간초과

매우 까다로운 문제이다...

pypy3로 제출

코드

import sys

N, M = map(int, sys.stdin.readline().split())
bbuyo = [[0]*(M+1) for _ in range(N+1)]
answer = 0

def dfs(cnt):
    global answer
    if cnt == N * M:
        answer += 1
        return
    
    y = cnt // M + 1
    x = cnt  % M + 1
    
    dfs(cnt + 1)
    if bbuyo[y - 1][x] == 0 or bbuyo[y][x - 1] == 0 or bbuyo[y - 1][x - 1] == 0: 
        bbuyo[y][x] = 1
        dfs(cnt + 1)
        bbuyo[y][x] = 0
        
        
dfs(0)
print(answer)
Comments