백준 / 14500번 테트로미노- 백트래킹, dfs / Python 파이썬

2025. 4. 1. 00:36·coding test - python/백준
728x90
반응형

 

*문제 출처는 백준에 있습니다.

문제 제목: 테트로미노

문제 사이트: https://www.acmicpc.net/problem/14500

 

 

 

이미지 참고 : https://wikidocs.net/217631 근데 여기 코드는 시간 초과남, 방문처리때문인듯


나의 풀이 - 첫번째 풀이 시간초과

import sys

input = sys.stdin.readline

N,M = map(int,input().split())
direct = ((-1,0),(1,0),(0,-1),(0,1)) # 상하좌우
maps = []
max_sum = 0
for i in range(N):
    # 종이에 쓰여 있는 수
     maps.append(list(map(int,input().split())))

def dfs(visited_points,cnt,total):
    global max_sum
    # 백트래킹은 dfs
    if cnt == 4:
        if max_sum < total:
            max_sum = total
        return
    else:
        for y,x in visited_points:
            for i in range(4):
                ny = y + direct[i][0]
                nx = x + direct[i][1]
                if [ny,nx] not in visited_points and 0 <= ny < N and 0 <= nx < M:
                    visited_points.append([ny,nx])
                    dfs(visited_points,cnt + 1,total + maps[ny][nx])
                    visited_points.pop()  # 백트래킹 (for 문 안이라서 pop 안해주면 list 에 누적됨)
for i in range(N):
    for j in range(M):
        dfs([[i,j]],1,maps[i][j])
# 출력: 테르노미노가 놓인 칸의 수들의 합(합을 최대로 해야함)
print(max_sum)

 

> 방문처리를 매번 리스트에 넣어두고 진행해서 에러남

> 전역으로 관리해야함

> ㅗ, ㅜ , ㅓ, ㅏ 와 같은 스페셜 케이스 관리

 

모범답안(두번쨰 풀이)

import sys

input = sys.stdin.readline

N,M = map(int,input().split())
direct = ((-1,0),(1,0),(0,-1),(0,1)) # 상하좌우

maps = []
max_sum = 0
visited = [[False] * M for _ in range(N)]
for i in range(N):
    # 종이에 쓰여 있는 수
     maps.append(list(map(int,input().split())))

def dfs(y,x,cnt,total):
    global max_sum
    global visited
    # 백트래킹은 dfs
    if cnt == 4:
        if max_sum < total:
            max_sum = total
        return
    else:
        for i in range(4):
            ny = y + direct[i][0]
            nx = x + direct[i][1]
            if 0 <= ny < N and 0 <= nx < M and visited[ny][nx] == False:
                visited[ny][nx] = True
                dfs(ny,nx,cnt + 1,total + maps[ny][nx])
                visited[ny][nx] = False

def check_other_case(y,x):
    # ㅗ,ㅜ,ㅓ,ㅏ 확인
    global visited, max_sum
    case = [((0, 0), (0, 1), (0, -1), (1, 0)) ,  # ㅜ
            ((0, 0), (0, 1), (0, -1), (-1, 0)),  # ㅗ
            ((0, 0), (-1, 0), (1, 0), (0, -1))  ,  # ㅓ
            ((0, 0), (-1, 0), (1, 0), (0, 1))]  # ㅏ
    for c in case:
        tmp_sum = 0
        for i in range(4):
            ny = y + c[i][0] 
            nx = x + c[i][1]
            if 0 <= ny < N and 0 <= nx < M:
                tmp_sum += maps[ny][nx]
            else:
                break
        if max_sum < tmp_sum:
            max_sum = tmp_sum



for i in range(N):
    for j in range(M):
        visited[i][j] = True
        dfs(i,j,1,maps[i][j])
        visited[i][j] = False # 백트래킹
        check_other_case(i,j)

# 출력: 테르노미노가 놓인 칸의 수들의 합(합을 최대로 해야함)
print(max_sum)


※ 알아야 할 것

- visited 로 True, False 제대로 지정해줘서 전역으로 방문처리 관리하면 메모리가 많이 안참(시간초과X)

- for 문 안에서는 백트래킹으로 꼭 pop을 해주자

- 스페셜 케이스도 잘 고려할 것

 

728x90
반응형

'coding test - python > 백준' 카테고리의 다른 글

백준 / 14503번 로봇청소기 -bfs, 시뮬 / Python 파이썬  (1) 2025.04.02
백준 / 23352번 방탈출 - bfs / Python 파이썬  (0) 2025.04.01
백준 / 1197번 최소 스패닝 트리 - 힙,해시 / Python 파이썬  (0) 2025.03.30
백준 / 2578번 빙고 - 구현 / Python 파이썬  (3) 2025.03.29
백준 / 1834번 나머지와 몫이 같은 수 / Python 파이썬  (0) 2025.03.29
'coding test - python/백준' 카테고리의 다른 글
  • 백준 / 14503번 로봇청소기 -bfs, 시뮬 / Python 파이썬
  • 백준 / 23352번 방탈출 - bfs / Python 파이썬
  • 백준 / 1197번 최소 스패닝 트리 - 힙,해시 / Python 파이썬
  • 백준 / 2578번 빙고 - 구현 / Python 파이썬
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (614)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (301)
        • Programmers (166)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (5)
        • Programmers (4)
        • 백준 (1)
        • 기본기문제 (0)
      • 공부정리 (5)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (2)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (8)
        • Git (2)
        • Docker (1)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (0)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    소수
    programmers
    백준
    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
백준 / 14500번 테트로미노- 백트래킹, dfs / Python 파이썬
상단으로

티스토리툴바