์์์ ํ ๋
ธ๋์์ ์์ํด์ ๋ค์ ๋ถ๊ธฐ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ
#์ฌ๊ท #์ํ #๋ฌดํ๋ฃจํํ์ถ #Back-Tracking
๋ด ํฌ์คํ
: [Python/ํ์ด์ฌ] [๐ฅ1] ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ 2583 - ์์ญ ๊ตฌํ๊ธฐ
์ด์ ํฌ์คํ
๊ณผ ๊ฐ์ด 4๋ฐฉํฅ ํ์ DFS๋ก๋ ์ ๊ทผ๊ฐ๋ฅํ์ง๋ง,
dx, dy๋ฅผ ์ด์ฉํ DFS์๊ณ ๋ฆฌ์ฆ ์ผ๋ก ํ์ดํด๋ณด๋ ค ํ๋ค.
n, RGB์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ์ ์ ์ฅํ๊ณ visited(๋ฐฉ๋ฌธํ์ธ์ฉ list)๋ฅผ False๋ก ์ด๊ธฐํํ์ฌ,
visited๊ฐ False์ผ ๋ dfs(x,y)
์คํ ํ True๋ก ์ ์ฅํ๋ฉด์ ๊ฐ ์์ญ์ ๊ฐ์๋ฅผ ์นด์ดํ
ํ์
โโ์ฃผ์์ฌํญ
์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ 'R', 'G'๋ฅผ ์๋ก ๋ค๋ฅธ ์์ญ์ผ๋ก ์ธ์งํ๊ณ ,
์ ๋ก์์ฝ์ธ ์ฌ๋์ 'R', 'G'๋ฅผ ํ๋์ ์์ญ์ผ๋ก ์ธ์งํ๋ค.
์ด๋ฅผ ์ฃผ์ํ์ฌ ๊ตฌํํ์
for loof
์ ์ด์ฉํดfor loof
์ ์ด์ฉํด amap์ 'R'์ 'G'๋ก ๋ฐ๊ฟ์ฃผ๊ณ import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000)
#์์ญ๊ตฌํ๊ธฐ
def dfs(x,y):
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
visited[y][x] = True
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<n and 0<=ny<n and amap[y][x] == amap[ny][nx] and not visited[ny][nx]:
dfs(nx,ny)
#์
๋ ฅ๊ฐ ๋ฐ์ ์ ์ฅํ๊ธฐ
n = int(input().rstrip())
amap = [list(map(str, input().rstrip())) for _ in range(n)]
visited = [[False]*n for _ in range(n)]
acnt = 0 #์ ๋ก์์ฝ ์๋์ฌ๋์ฉ ์นด์ดํ
๋ณ์
rgcnt = 0 #์ ๋ก์์ฝ์ธ ์ฌ๋์ฉ ์นด์ดํ
๋ณ์
#์ ๋ก์์ฝ์ด ์๋ ์ฌ๋ dfs()ํธ์ถํ๋ฉด์ ์์ญ ๊ฐ์ ์นด์ดํ
for y in range(n):
for x in range(n):
if not visited[y][x]:
dfs(x,y)
acnt += 1
#'R' โ 'G' : ์ ๋ก์์ฝ์ธ ์ฌ๋์ฉ map๋ง๋ค๊ธฐ (์ ๋ก์์ฝ : R==G ์ด๋ฏ๋ก)
for y in range(n):
for x in range(n):
if amap[y][x] == 'R':
amap[y][x] = 'G'
#์ ๋ก์์ฝ์ธ ์ฌ๋ dfs()ํธ์ถํ๋ฉด์ ์์ญ ๊ฐ์ ์นด์ดํ
visited = [[False]*n for _ in range(n)]
for y in range(n):
for x in range(n):
if not visited[y][x]:
dfs(x,y)
rgcnt += 1
print(acnt, rgcnt)
import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000) #dfs๊น์ด ๋๋ฆฌ๊ธฐ (๋ฐฑ์ค์ 1000์ด๋ผ ๋ฐํ์์๋ฌ๋๋๊น)
#์์ญ ๊ฐ์ ๊ตฌํ๊ธฐ
def dfs(x,y):
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
visited[y][x] = True #์ฌ๋ฐฉ๋ฌธํ์ง ์๋๋ก ๋ฐฉ๋ฌธํ์ ๋จ๊ธฐ๊ธฐ
#์๋ dx,dy๋ง์ for loof์ ์ด์ฉํ์ฌ dfs๊ฐ 4๋ฒ ์ฌํธ์ถ ๋๋๊ฑธ ๋ฐฉ์ง
#ํ์๋ ์ด์ ๊น์ง dfs(x-1,y), dfs(x+1,y) ์ด๋ฐ์์ผ๋ก 4๋ฒ ํธ์ถํ์์...
for i in range(4):
nx = x+dx[i] #x+dx[i] ๋ก ํ์ฌ์ nx๊ฐ ์ ์ฅ
ny = y+dy[i] #y+dy[i] ๋ก ํ์ฌ์ ny๊ฐ ์ ์ฅ
#ํ์ฌ nx,ny๊ฐ map์์ญ์ ๋ฒ์ด๋์ง ์๊ฑฐ๋, ๋ฐฉ๋ฌธํ์ ์ด ์์๋๋ง dfsํธ์ถ
if 0<=nx<n and 0<=ny<n and amap[y][x] == amap[ny][nx] and not visited[ny][nx]:
dfs(nx,ny)
n = int(input().rstrip())
amap = [list(map(str, input().rstrip())) for _ in range(n)]
visited = [[False]*n for _ in range(n)]
acnt = 0
#์ ๋ก์์ฝ์ด ์๋ ์ฌ๋ ์์ญ ๊ฐ์ ์นด์ดํ
for y in range(n):
for x in range(n):
if not visited[y][x]: #๋ฐฉ๋ฌธํ์ ์ด ์์ผ๋ฉด
dfs(x,y) #dfs(x,y)ํธ์ถํ์ฌ ๋ฐฉ๋ฌธํ์ ๋จ๊ธฐ๊ณ ,
acnt += 1 #์์ญ ๊ฐ์ ์นด์ดํ
#dfs๋ด์ฉ์ ์ 1๋ฒ๊ณผ ๊ฐ์
def dfs(x,y):
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
visited[y][x] = True
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if 0<=nx<n and 0<=ny<n and amap[y][x] == amap[ny][nx] and not visited[ny][nx]:
dfs(nx,ny)
#์ ๋ก์์ฝ์ฉ map๋ง๋ค๊ธฐ (amap์ RโG)
#์ ๋ก์์ฝ์ R==G๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ!
for y in range(n):
for x in range(n):
if amap[y][x] == 'R':
amap[y][x] = 'G'
#์ ๋ก์์ฝ์ ์์ญ ๊ฐ์ ์นด์ดํ
rgcnt = 0
visited = [[False]*n for _ in range(n)] #์์์ ๋๋ฝํ ๋ฐฉ๋ฌธํ์ ์ด๊ธฐํ
for y in range(n):
for x in range(n):
if not visited[y][x]:
dfs(x,y)
rgcnt += 1
print(acnt, rgcnt)
1. ์ผ๋จ R,G,B๋ก ํ๋ฉด ๋ญ๊ฐ ์ค๋ฅ๊ฐ ์์ ๊ฒ ๊ฐ์ผ๋๊น R=0, B=1, G=2๋ก ๋ณด๊ธฐ์ข๊ฒ ๋งคํํ์
(์??? ์์ง ์ ๋ ๊ฒ ์๊ฐํ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์.. ๊ทธ๋๋ ๋ฌธ์๋ ์ซ์๋ ์ทจํฅ์ฐจ์ด๋๊น ๋์ด๊ฐ์..)
2. ๊ทธ๋ฆฌ๊ณ for loof ํ ๋ฒ์ ์ ๋ก์์ฝ์ธ ์ฌ๋๊ณผ ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ map์
"ํ๊บผ๋ฒ์"ํ์ธํ๋ฉด์ ์นด์ดํ
ํ๊ณ ์ถ๋ค.
(๊ฐ์ ๊น์ด์ for loof์ 1๋ฒ์ด๋ 2๋ฒ์ด๋ ์๊ฐ๋ณต์ก๋๋ ๋๊ฐ์๋ฐ... ๊ทธ๋๋ ์ ๊ทผ์ ์ข๋ค)
3. ์ ๋ก์์ฝ์ธ ์ฌ๋๊ณผ ์ ๋ก์์ฝ์ด ์๋์ฌ๋์ map์ ๋ฐ๋ก ๋ง๋ค์ - ํ๊บผ๋ฒ์ ๋๋ ค์ผ ํ๋๊น
(list ๋ฉ๋ชจ๋ฆฌ 2๋ฐฐ๋ก ์ก์๋จน๊ณ ~๐คฆ๐ปโโ๏ธ)
4. dfs์์ ๋ฐฉ๋ฌธํ ์์ญ์ amap/rgmap์ 3์ผ๋ก ๋งคํํ์ - ์ฌ๋ฐฉ๋ฌธํ๋ฉด ์๋๋๊น
(visited ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ ์ฒดํฌํ๋ฉด ์๋์ amap/rgmap์ด ๋๋ฌ์์ง์ง ์์ํ
๋ฐ)
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10000)
n = int(input().rstrip())
graph = [list(input().rstrip()) for _ in range(n)]
amap = []
rgmap = []
acnt = 0
rgcnt = 0
#์์ญ ๊ฐ์ ๊ตฌํ๊ธฐ
#4๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ํ์ฌ์ ์ซ์(num)๋ฅผ ๋ฐ์์ผ๋ก์จ, num์ด ์๋ ๊ณณ์ ๊ฒ์ฌํ์ง ์์
def dfs(x,y,map,num):
if x<0 or y<0 or x>=n or y>=n:
return
if map[y][x] == 3 and map[y][x] != num:
return
elif map[y][x] == num:
map[y][x] = 3
dfs(x-1,y,map,num)
dfs(x,y-1,map,num)
dfs(x+1,y,map,num)
dfs(x,y+1,map,num)
return
else:
return
#์ ๋ก์์ฝ ์๋์ฌ๋์ฉ, ์ ๋ก์์ฝ์ฉ map ๋ง๋ค๊ธฐ
for rgb in graph:
string = 0
num = '' #์ ๋ก์์ฝ์ด ์๋์ฌ๋์ amap์ ๋งคํ๋ str
rgnum = '' #์ ๋ก์์ฝ์ธ ์ฌ๋์ rgmap์ ๋งคํ๋ str
for string in rgb:
if string == 'R':
num += str(0)+' '
rgnum += str(0)+' ' #์ ๋ก์์ฝ์ R==G๋๊น
elif string == 'B':
num += str(1)+' '
rgnum += str(1)+' '
elif string == 'G':
num += str(2)+' '
rgnum += str(0)+' ' #์ ๋ก์์ฝ์ R==G๋๊น
amap.append(list(map(int, num.split())))
rgmap.append(list(map(int, rgnum.split())))
#amap, rgmap ๋์์ ๋๋ฆฌ๋ฉด์ ์์ญ๊ตฌํ๊ณ ๋ฐฉ๋ฌธํ ์์ญ์ 3์ผ๋ก ๋งคํ
for y in range(n):
for x in range(n):
if amap[y][x] != 3:
dfs(x,y,amap,amap[y][x])
acnt += 1
if rgmap[y][x] != 3:
dfs(x,y,rgmap,rgmap[y][x])
rgcnt += 1
print(acnt, rgcnt, sep=' ')
R=0, B=1, G=2 ๋งคํํ๋ ๊ฑด ๋๊ฐ๊ณ ๋์๋ ๋๊ฐ์๋ฐ visited๋ฅผ ์ถ๊ฐํ๊ณ ,
dfs()
์์์ R(0)โG(2)๋ก ๋ณ๊ฒฝํ์ฌ ์ ๋ก์์ฝ์ฉ map์ผ๋ก ๋ง๋ค์์
๐๐ป๊ฒฐ๋ก : ๋ฉ๋ชจ๋ฆฌ๋ ๋ ์ก์๋จน๊ณ ์๊ฐ์ด 30ms ์ค์ด๋ฆ๐คฃ
1. for loof๋ก ๋์์ ์นด์ดํ
ํ๋ ์์ด๋์ด๋ ๋ฒ๋ฆฌ๊ณ , visited๋ฅผ ๋ง๋ค์.
์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ amap์ dfs()๋ก ๊ฒ์ฌํ๋ฉด์ ๋ฐฉ๋ฌธํ์ ์ ๋จ๊ธฐ๊ณ ,
dfs()์์์ R์ ์ฐพ์ G๋ก amap์ ๋ณ๊ฒฝํ์ฌ ์ ๋ก์์ฝ์ฉ map์ ๋ง๋ค์ด์ฃผ์
(for loor๋ฅผ ๋ ๋ฒ ๋๊ธด ํ์ง๋ง ์๊ฐ๋ณต์ก๋๋ ๋๊ฐ์์ ์ ๊ทผ์ ์ข์์ผ๋..
์ด๋ฌ๋ฉด์ dfs์์์ R์ผ๋์ ์กฐ๊ฑด์์ด ์ถ๊ฐ๋์ด์... ์ทจํฅ์ฐจ์ด ์ธ๊ฑธ๋ก)
2. ๋ง๋ค์ด์ง map์ ์ด์ฉํ์ฌ ์ ๋ก์์ฝ์ธ ์ฌ๋์ ์์ญ์ ์นด์ดํ
ํ์
import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000)
n = int(input().rstrip())
rgb = [list(map(str, input().rstrip())) for _ in range(n)]
amap = []
visited = [[0 for _ in range(n)] for _ in range(n)]
cnt = 0
res = []
def dfs(x,y,num):
if x<0 or y<0 or x>=n or y>=n:
return
if visited[y][x] == 1 or amap[y][x] != num:
return
elif amap[y][x] == num:
visited[y][x] = 1
if num == 2:
amap[y][x] = 0
dfs(x-1,y,num)
dfs(x,y-1,num)
dfs(x+1,y,num)
dfs(x,y+1,num)
return
for string in rgb:
num = ''
for al in string:
if al == 'R':
num += str(0)+' '
elif al == 'B':
num += str(1)+' '
elif al == 'G':
num += str(2)+' '
amap.append(list(map(int, num.split())))
for y in range(n):
for x in range(n):
if not visited[y][x]:
dfs(x,y,amap[y][x])
cnt += 1
res.append(cnt)
cnt = 0
visited = [[0 for _ in range(n)] for _ in range(n)]
for y in range(n):
for x in range(n):
if not visited[y][x]:
dfs(x,y,amap[y][x])
cnt += 1
res.append(cnt)
print(*res)
์ ์์ผ๋ก 4๋ฐฉํฅ ํ์ํ๋ DFS์๊ณ ๋ฆฌ์ฆ๋ ์ข์ง๋ง, dx,dy๋ฅผ ์ด์ฉํ DFS์๊ณ ๋ฆฌ์ฆ๋ ์ฐ์ตํด๋ณด์
+์ฒซ ๊ณจ๋ ๋ฌธ์ ๋ฅผ ๋ชป ํผ๊ฒ ์ข ์์ฝ๋ค.. ์ค๋ฒ ๋ฌธ์ ๋ ์ฐจ์์ด ์ข ๋ค๋ฅธ ๊ฒ ๊ฐ๋ค๐