import sys
def input():
return sys.stdin.readline()
N,M = map(int,input().split())
def find_parents(X):
if X == make_set[X]:
return X
make_set[X] = find_parents(make_set[X])
return make_set[X]
def union(x,y):
X = find_parents(x)
Y = find_parents(y)
if X !=Y:
if ranks[X]< ranks[Y]:
X,Y = Y,X
make_set[Y] = X
cnt[X] += cnt[Y]
if ranks[X] == ranks[Y]:
ranks[X] += 1
return True
return False
dire = {
"U": [-1,0],
"L": [0,-1],
"R" : [0, 1],
'D': [1,0]
}
arr = [list(input()) for _ in range(N)]
make_set = [i for i in range(N*M+1)]
ranks = [1 for _ in range(N*M+1)]
cnt = [1 for _ in range(N*M+1)]
ranks[N*M] = float('inf')
for x in range(N):
for y in range(M):
point = x*M+y
dx,dy = dire[arr[x][y]]
nx = x + dx
ny = y + dy
if 0<=nx<N and 0<=ny<M:
next_point = (x+dx)*M+y+dy
union(point,next_point)
else:
union(point,N*M)
print(cnt[N*M]-1)
boj.kr/16724 와 동일한 방식으로 풀었다.
그러니깐 미로를 탈출 즉 범위를 벗어나는 경우를 N*M일때로 지정을 해주고, ranks를 최대로 준뒤
무조건 외각이 되었을때 외각이 부모가 되도록 만들어줬다.
주어진 미로의 크기는 N*M인데, N*M + 1 만큼의 make_set과 ranks, cnt를 만들어주고,
미로의 범위 내 이면 두개의 점을 union을 해주고,
범위 밖이면 우리가 만들어놓은 N*M에 union을 해주게 했다.
그리고 마지막에 cnt[N*M]에서 -1을 해주면 전체에서 탈출할 수 있는 칸의 수가 나오게 된다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 18513 쉼터 (0) | 2021.09.03 |
---|---|
[BOJ/백준] 17143 낚시왕 (0) | 2021.09.03 |
[BOJ/백준] 3108 로고 (0) | 2021.09.03 |
[BOJ/백준] 14938 서강그라운드 (0) | 2021.09.02 |
[BOJ/백준] 14621 나만 안되는 연애 (0) | 2021.09.02 |