백준 / 1987번 / 알파벳 / python 파이썬

2024. 12. 2. 23:30·코딩테스트/백준 (python)

 

문제 : https://www.acmicpc.net/problem/1987

 

 

 


나의 풀이 (시간 초과)

import sys
input = sys.stdin.readline
R, C = map(int, input().split())

board = [[_ for _ in range(C)]  for _ in range(R)]

for i in range(R):
    alp = input()
    for j in range(C):
        board[i][j] = alp[j]

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def DFS(x, y, visited, count):
    global max_count
    max_count = max(max_count, count)

    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < R and 0 <= ny < C and board[nx][ny] not in visited:
            visited.add(board[nx][ny])
            DFS(nx, ny, visited, count + 1)
            visited.remove(board[nx][ny]) #백트래킹

visited = set()
visited.add(board[0][0])
max_count = 1

DFS(0, 0, visited, 1)
print(max_count)

재귀 기반 DFS로 set()을 이용해 지나온 알파벳을 관리하였으나 시간 초과였다.

DFS에서 재귀 깊이가 깊어지거나 많은 상태를 탐색할 경우 시간 초과가 발생할 수 있다고 한다.

 

새로운 풀이

R, C = map(int, input().split())
board = [list(input()) for _ in range(R)]

ans = 0
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

def dfs(board, v, visited, depth):
    global ans

    x, y = v
    stack = set()
    stack.add((x, y, visited + board[x][y], depth))

    while stack:
        nx, ny, nowvisited, nowdepth = stack.pop()
        ans = max(ans, nowdepth)
        for i in range(4):
            newx = nx + dx[i]
            newy = ny + dy[i]
            if 0 <= newx < R and 0 <= newy < C and board[newx][newy] not in nowvisited:
                stack.add((newx, newy, nowvisited + board[newx][newy], nowdepth + 1))
    return

dfs(board, (0, 0), '', 1)

print(ans)

 

이 코드는 DFS를 스택을 이용해 반복문으로 구현하고, visited는 문자열로 관리하는 풀이이다.

스택을 사용하는 방식은 재귀에서 발생할 수 있는 중복 호출과 상태 전달 비용이 적고, 반복문을 사용하여 호출 스택을 깊게 쌓지 않아 메모리 오버헤드가 줄어든다.

 

'코딩테스트 > 백준 (python)' 카테고리의 다른 글

백준 / 1916번 / 최소비용 구하기 / python 파이썬  (0) 2025.01.02
백준 / 11659번 / 구간 합 구하기 4 / python 파이썬  (0) 2025.01.02
백준 / 16953번 / A → B / python 파이썬  (0) 2024.11.25
백준 / 1927번 / 최소 힙 / python 파이썬  (0) 2024.11.22
백준 / 1766번 / 문제집 / python 파이썬  (0) 2024.11.17
'코딩테스트/백준 (python)' 카테고리의 다른 글
  • 백준 / 1916번 / 최소비용 구하기 / python 파이썬
  • 백준 / 11659번 / 구간 합 구하기 4 / python 파이썬
  • 백준 / 16953번 / A → B / python 파이썬
  • 백준 / 1927번 / 최소 힙 / python 파이썬
seulll
seulll
개인 공부 / 정리 블로그입니다 https://github.com/seul1009
  • seulll
    seulll
    seulll
  • 전체
    오늘
    어제
    • 분류 전체보기 (344) N
      • 코딩테스트 (236) N
        • programmers (python) (158) N
        • 백준 (python) (76) N
      • 자료구조 | 알고리즘 (14)
      • 개발 | 프로젝트 (43)
        • Python (4)
        • Java | Spring (7)
        • Android (5)
        • Unity (3)
        • API (4)
      • CS (15)
        • Network (5)
        • SQL (2)
        • OS (4)
      • 데이터 분석 (14)
      • 기타 (13)
  • 블로그 메뉴

    • 홈
    • 태그
    • 글쓰기
    • 설정
  • 링크

    • GitHub
  • 인기 글

  • 태그

    API
    프로그래머스
    kakao map api
    오차행렬
    바다코끼리
    프렌즈4블록
    train_test_split
    데이터분석
    그리디 알고리즘
    asterisk
    파이썬
    백엔드 개발자 역량
    백엔드
    티스토리챌린지
    웹크롤링
    대입 표현식
    모델 성능 평가
    백엔드 개발자
    solving environment
    코딩테스트
    카카오맵
    confusion matrix
    박스플롯
    Greedy
    Python
    야근 지수
    오블완
    카카오맵 api
    Boxplot
    2 x n 타일링
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
seulll
백준 / 1987번 / 알파벳 / python 파이썬
상단으로

티스토리툴바