땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • E
  • ㅗ
  • I
  • D
  • 이것이 리눅스다 with Rocky Linux9

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

백준 14500 테트로미노(Brute-Force, DFS)
Algorithm/Algorithm Problem

백준 14500 테트로미노(Brute-Force, DFS)

2022. 5. 9. 15:43

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

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

N x M의 보드에 우리가 알고있는 테트리스 블록을 넣었을 때 최대가 되는 값을 구해주는 것이 문제다.

 

1. 5가지 블록을 회전, 뒤집기 모두 가능하기 때문에 모든 경우의 수를 따져서 직접 board에 일일이 해보는 Brute-Force

2. DFS 

 

1번 같은 경우가 바로 생각난 풀이법인데 이렇게 하면 풀리겠지만 별로 하고싶은 문제는 아니였다.

그래서 고민을 해본결과 ㅗ형 블록을 제외하면 나머지도형은 한점에서 시작해서 한붓그리기가 가능한 도형이기 때문에

DFS로 depth == 4 일 때 maxvalue를 계속 갱신해주면 된다고 생각했다.

 

하지만 ㅗ의 경우를 구하는게 매우 난제였다.

충분히 고민해본결과 똑같이 dfs를 돌리다가 cnt가 2가 되는순간 상하좌우를 더한 nx,ny에 대해 다음 dfs를 돌리는게 아닌 x,y에 대해 다시 dfs를 돌리는 것이다.

 

즉 cnt == 2일 땐 상하좌우로 모두 이동가능한 형태인데 cnt == 4일 때 return이 되기 때문에 ㅗ의 회전형태가 나올 것이다.

 

 

import sys
input = sys.stdin.readline

def dfs(x,y,ans,cnt):
    global maxValue

    if cnt == 4:
        maxValue = max(maxValue, ans)
        return

    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny]:
            if cnt == 2:
                visited[nx][ny] = 1
                dfs(x,y,ans+data[nx][ny],cnt + 1)
                visited[nx][ny] = 0
            visited[nx][ny] = 1
            dfs(nx, ny, ans + data[nx][ny], cnt + 1)
            visited[nx][ny] = 0

n,m = list(map(int,input().split()))
data = [list(map(int,input().split())) for _ in range(n)]
maxValue = 0

dx = [-1,0,0,1]
dy = [0,1,-1,0]
visited = [[False] * m for _ in range(n)]

for i in range(n):
    for j in range(m):
        visited[i][j] = 1
        dfs(i,j,data[i][j],1)
        visited[i][j] = 0

print(maxValue)

 

 

 

 

 

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 7662 이중 우선순위 큐(Heapq)  (0) 2022.05.12
백준 16928 뱀과 사다리 게임(BFS)  (0) 2022.05.10
백준 9019 DSLR(시간복잡도, BFS)  (0) 2022.05.06
백준 7569 토마토(3차원배열, BFS)  (0) 2022.05.06
백준 5430 AC(Queue)  (0) 2022.05.06
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 7662 이중 우선순위 큐(Heapq)
    • 백준 16928 뱀과 사다리 게임(BFS)
    • 백준 9019 DSLR(시간복잡도, BFS)
    • 백준 7569 토마토(3차원배열, BFS)
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바