새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 1987 알파벳

by 언호 2022. 3. 31.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

상하좌우칸을 이동하면서 지나온 정보들을 집합으로 저장하여 기록 및 중복 여부를 확인하였습니다.

시간초과를 고려하여 집합을 이용하여 알파벳을 기록하였으나 시간초과가 발생하였습니다.

이후 리스트에서 좌표들의 정보를 가지고 탐색하던것을 중복을 줄이기 위하여 집합을 이용하였습니다.

2) 알고리즘

  • DFS

3) 풀이 코드

사용 언어 - Python

import sys
sys.stdin = open('input.txt')

dr = [-1, 0, 1, 0]                                              # 위 오른쪽 아래 왼쪽
dc = [0, 1, 0, -1]

def solution():
    global answer

    s = set([(0, 0, board[0][0])])                              # 좌표, 지나온 좌표들의 알파벳 기록 (시간 단축을 위해 일반 리스트가 아닌 집합으로 관리)

    while s and answer < 26:                                    # 탐색할게 아직 남았거나, 알파벳 26개를 모두 찾은 경우 종료
        y, x, ans = s.pop()                                     # 좌표, 발견한 알파벳 기록

        for k in range(4):
            r = y + dr[k]                                       # 다음 좌표
            c = x + dc[k]       

            if 0 <= r < R and 0 <= c < C:
                if board[r][c] not in ans:                      # 현재 좌표의 알파벳이 이전에 지나오지 않았다면
                    s.add((r, c, ans + board[r][c]))            # 집합에 추가
                    answer = max(answer, len(ans)+1)            # 정답 최댓값 갱신

R, C = map(int, sys.stdin.readline().split())                       # 세로, 가로
board = [list(sys.stdin.readline().rstrip()) for _ in range(R)]     # 배열의 정보
answer = 1                                                          # 정답 (시작이 포함되어야 하므로 최소 1)

solution()                                                      # 탐색

print(answer)                                                       # 출력

📝 결과 및 학습한 내용

1) 어려웠던 내용

시간초과를 고려하여 방문한 알파벳 목록을 집합으로 관리를 하였지만, 탐색 과정이 길어지면 시간초과가 발생하였습니다.

탐색 과정을 줄이기 위하여 집합을 이용하였습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

- https://www.acmicpc.net/problem/1987

 

1987번: 알파벳

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으

www.acmicpc.net

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 1202 보석 도둑  (0) 2022.04.09
[백준] 2749 피보나치 수 3  (0) 2022.04.02
[백준] 10800 컬러볼  (0) 2022.03.30
[백준] 9370 미확인 도착지  (0) 2022.03.29
[백준] 15900 나무 탈출  (0) 2022.03.28

댓글