📖 문제
🧑🏻💻 풀이 과정
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 |
댓글