티스토리 뷰

알고리즘/BOJ

[BOJ-1987] 알파벳

개발하는 후딘 2020. 4. 19. 02:42
728x90
반응형

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

 

1987번: 알파벳

문제 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다. 좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는

www.acmicpc.net


[풀이]

이전에 맞았다고했는데, 데이터 추가로 재채점한 결과 틀린 상태가 되어서 다시 풀어보기로 했다.

DFS를 이용해서 풀었다.

MAP의 원소는 A~Z 까지니, 방문리스트 visited의 길이는 26이다.

(* 말이 최대한 움직일 수 있는 횟수는 A~Z까지 26가지란 것을 단박에 알 수 있다)

 

그리고 DFS는 DFS함수를 호출할때마다, 말의 이동횟수의 최댓값을 비교해야한다.

즉, 전역변수 max_alpha와 매개변수 cnt(현재 말이 움직인횟수) 를 비교하여

max_alpha를 업데이트하여 말이 (이동한 위치마다 알파벳이 모두 다르도록)이동한 횟수의 최댓값을 구한다.

 

전역변수 max_alpha=0으로 먼저 초기화했는데

max_alpha가 말이 최대한 (이동할때마다 서로다른 알파벳이 나오도록) 이동한 횟수 이다.

 

 

(1) 초기 (0,0) 위치를 방문해야한다. 

먼저 말은 (0,0)을 당연히 방문을 해야한다.

그래서 (0,0) 위치에 있는 알파벳에 대한 방문리스트 상태를 True로 했다. (visited[MAP[0][0]-'A']=True)

(0,0)위치를 방문했으므로 초기방문횟수는 1로했다.

 

문제의 조건은 말은 이동할때마다, 움직인 곳마다의 알파벳이 모두 달라야한다.

초기 말의 위치에 대한 DFS함수를 호출하면, DFS( 현재Y좌표:0, 현재X좌표:0, 움직인횟수: 1)

 

(2) 말의 현위치의 상/하/좌/우 의 위치가 R행C열 배열에 해당하는 원소인지 확인한다. 

(3) 말의 현위치의 상/하/좌/우 의 위치(nexty, nextx)의 알파벳이 아직 방문하지 않은 상태라면

-> visited[MAP[nexty][nextx] -'A'] =True 로 한다.

-> DFS( nexty, nextx, cnt+1 )

-> 다른 DFS를 호출할때 이미 방문한 곳이 최대방문횟수가 나올 수 있는 경우가 있을 수 있으므로

    DFS호출 후 visited[MAP[nexty][nextx]-'A']를 True로 하자.


[코드-python3]

import sys
from copy import deepcopy
input=sys.stdin.readline

dy=(-1,1,0,0)
dx=(0,0,-1,1)
max_alpha=0

def dfs(cury, curx, cnt):
    global MAP,R,C, max_alpha, visited
    max_alpha=max(max_alpha, cnt)
    for i in range(4):
        nexty=cury+dy[i]
        nextx=curx+dx[i]
        if (nexty>=0 and nexty<R) and (nextx>=0 and nextx<C):
            if not visited[ord(MAP[nexty][nextx])-ord('A')]:
                visited[ord(MAP[nexty][nextx])-ord('A')]=True
                dfs(nexty, nextx, cnt+1)
                visited[ord(MAP[nexty][nextx])-ord('A')]=False
                
R,C= map(int, input().strip().split())
MAP=[ [*input().strip()] for _ in range(R)]

visited=[False]*26
visited[ord(MAP[0][0])-ord('A')]=True
dfs(0,0,1)
print(max_alpha)

 

 

 

 

728x90
반응형

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ-1915] 가장 큰 정사각형  (0) 2020.04.20
[BOJ-1339] 단어수학  (0) 2020.04.19
[BOJ-2096] 내려가기  (0) 2020.04.19
[BOJ-1022] 소용돌이 예쁘게 출력하기  (0) 2020.04.08
[BOJ-15649] N과 M(1)  (0) 2020.04.08
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함