๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/10026)
<์ ๋ก์์ฝ>
๋ฌธ์
์ ๋ก์์ฝ์ ๋นจ๊ฐ์๊ณผ ์ด๋ก์์ ์ฐจ์ด๋ฅผ ๊ฑฐ์ ๋๋ผ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์, ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ณด๋ ๊ทธ๋ฆผ์ ์๋ ์ฌ๋์ด ๋ณด๋ ๊ทธ๋ฆผ๊ณผ๋ ์ข ๋ค๋ฅผ ์ ์๋ค.
ํฌ๊ธฐ๊ฐ N×N์ธ ๊ทธ๋ฆฌ๋์ ๊ฐ ์นธ์ R(๋นจ๊ฐ), G(์ด๋ก), B(ํ๋) ์ค ํ๋๋ฅผ ์์น ํ ๊ทธ๋ฆผ์ด ์๋ค. ๊ทธ๋ฆผ์ ๋ช ๊ฐ์ ๊ตฌ์ญ์ผ๋ก ๋๋์ด์ ธ ์๋๋ฐ, ๊ตฌ์ญ์ ๊ฐ์ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋, ๊ฐ์ ์์์ด ์ํ์ข์ฐ๋ก ์ธ์ ํด ์๋ ๊ฒฝ์ฐ์ ๋ ๊ธ์๋ ๊ฐ์ ๊ตฌ์ญ์ ์ํ๋ค. (์์์ ์ฐจ์ด๋ฅผ ๊ฑฐ์ ๋๋ผ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ๊ฐ์ ์์์ด๋ผ ํ๋ค)
์๋ฅผ ๋ค์ด, ๊ทธ๋ฆผ์ด ์๋์ ๊ฐ์ ๊ฒฝ์ฐ์
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR
์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ด ๋ดค์ ๋ ๊ตฌ์ญ์ ์๋ ์ด 4๊ฐ์ด๋ค. (๋นจ๊ฐ 2, ํ๋ 1, ์ด๋ก 1) ํ์ง๋ง, ์ ๋ก์์ฝ์ธ ์ฌ๋์ ๊ตฌ์ญ์ 3๊ฐ ๋ณผ ์ ์๋ค. (๋นจ๊ฐ-์ด๋ก 2, ํ๋ 1)
๊ทธ๋ฆผ์ด ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ก์ ๋, ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ดค์ ๋์ ์๋ ์ฌ๋์ด ๋ดค์ ๋ ๊ตฌ์ญ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 100)
๋์งธ ์ค๋ถํฐ N๊ฐ ์ค์๋ ๊ทธ๋ฆผ์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ด ๋ดค์ ๋์ ๊ตฌ์ญ์ ๊ฐ์์ ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ดค์ ๋์ ๊ตฌ์ญ์ ์๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํด ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด
- my solution
import sys
def RGB(graph, i,j, visited, flag): # ๊ทธ๋ฆผ, x, y, ๋ฐฉ๋ฌธ, ์ ๋ก์์ฝ ๊ตฌ๋ถ
dx=[-1,0,0,1] # ์,์ข,์ฐ,ํ
dy=[0,-1,1,0]
queue=[[i,j]]
visited[i][j]=1
while queue:
a,b=queue.pop(0)
for i in range(4):
x=a+dx[i]
y=b+dy[i]
if x>=0 and x<len(graph) and y>=0 and y<len(graph): #๋ฒ์์ ์ํ๋ฉด
if flag==0: # ์ ๋ก์์ฝ x
if visited[x][y]==0 and graph[a][b]==graph[x][y] :
queue.append([x,y])
visited[x][y] = 1
else: # ์ ๋ก์์ฝ
if visited[x][y]==0:
if graph[a][b]=='R' or graph[a][b]=='G': # R,G ๊ตฌ๋ถ x
if graph[x][y]=='R' or graph[x][y]=='G':
queue.append([x,y])
visited[x][y] = 1
else: # B
if graph[a][b]==graph[x][y] :
queue.append([x,y])
visited[x][y] = 1
if __name__=='__main__':
n=int(input())
graph=[]
visited=[[0] *n for i in range(n)]
visited_RG_B=[[0] *n for i in range(n)] # ์ ๋ก์์ฝ
for i in range(n): #input
graph.append(list(sys.stdin.readline().strip()))
rgb_cnt=0
rg_b_cnt=0 # ์ ๋ก์์ฝ
for i in range(n):
for j in range(n):
if visited[i][j]==0: # ๋ฐฉ๋ฌธ x
rgb_cnt+=1
RGB(graph, i,j, visited,0)
if visited_RG_B[i][j]==0: # ์ ๋ก์์ฝ_ ๋ฐฉ๋ฌธ x
rg_b_cnt+=1
RGB(graph, i, j, visited_RG_B,1)
print(rgb_cnt, rg_b_cnt)
- RGB (๊ทธ๋ฆผ, x, y, ๋ฐฉ๋ฌธ ์ฌ๋ถ list, ์ ๋ก์์ฝ ๊ตฌ๋ถ)
: dx, dy = ์์ข์ฐํ ํ์
: queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต -> ์ ์ผ ์ฒ์ ๊ฐ์ pop -> ์์ข์ฐํ๋ฅผ ํ์ธํ์ฌ ๊ทธ๋ฆผ ๋ฒ์์ ์ํ๋ฉด -> ์ ๋ก์์ฝ์ธ์ง ์๋์ง flag ํตํด ํ์ธ
: ์ ๋ก์์ฝ์ด ์๋๋ฉด = ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉฐ ํ์ฌ ์์น์ ์ด๋ํ ์์น๊ฐ ๊ฐ์ ๊ฐ์ธ์ง ํ์ธ ํ queue์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ๊ธฐ
: ์ ๋ก์์ฝ์ด๋ฉด = ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด = ํ์ฌ ๊ฐ์ด R, G์ด๋ฉฐ ์ด๋ํ ์์น์ ๊ฐ์ด R, G๋ผ๋ฉด queue์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ๊ธฐ but B๋ผ๋ฉด B์ธ์ง ํ์ธ ํ queue์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ํ์ธ - main
: graph = ๊ทธ๋ฆผ
: visited = ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋์ ๋ฐฉ๋ฌธ list
visited_RG_B = ์ ๋ก์์ฝ์ธ ์ฌ๋์ ๋ฐฉ๋ฌธ list
: input = ๊ทธ๋ฆผ ์ ๋ ฅ
: rgb_cnt, rg_b_cnt = ์ ๋ก์์ฝ์ด ์๋ ๊ตฌ์ญ ๊ฐ์, ์ ๋ก์์ฝ ๊ตฌ์ญ ๊ฐ์
: ์ ์ฒด ์ํํ๋ฉฐ ์ ๋ก์์ฝ์ด ์๋ ์ฌ๋๊ณผ ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด RGB ํจ์ ํธ์ถํ์ฌ ๊ตฌ์ญ ๊ตฌํจ
โ ์ฒ์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ?
RGB ํจ์ ์์์ visited๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ๋ฐ์ํ ๊ฒ์ด์๋ค. ๋ด๊ฐ ์ฒ์ ์์ฑํ ์ฝ๋๋ queue์์ pop ํ ํ visited๋ฅผ 1๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ด์๋ค. ์ด๋ ๊ฒ ๋ ๊ฒฝ์ฐ ๋ง์ฝ queue์ [[1,0], [1,1]] ์ด ์๋ค๋ฉด [1,1]์ ์์ง visited ๊ฐ์ด 0์ด๊ธฐ ๋๋ฌธ์ queue์ ๋ ์ถ๊ฐ๋ ์ ์๋ค. ์ด ๊ณผ์ ์์ ๋๊ฐ์ ๊ฐ์ด ์ฌ๋ฌ ๋ฒ ์งํ๋๋ฉด์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์๋ค. ๊ทธ๋ฌ๋ฏ๋ก queue์ ๋ฃ์ผ๋ฉด์ visited๋ฅผ 1๋ก ๋ฐ๊ฟ์ฃผ๋๋ก ํ๋๋ ํต๊ณผํ ์ ์์๋ค.
์๊ฐ๐ค
์ฒ์ ์ฝ๋๋ฅผ ์ ์ถํ๊ณ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์ฌ ์ ๋ฏฟ๊ฒจ ๋ค์ ์ ์ถํด๋ดค๋ค.. ๐ฅ
ํ ์ค ์ฐจ์ด๋ก ์๊ฐ ์ด๊ณผ๊ฐ ๊ฐ๋ฆฌ๋ค๋ ๊ทธ๋๋ ์ดํด ์๋ฃ -!
์ด๋ฐ ๊ฑฐ ์๋ ค์ฃผ๋ ์ฌ๋์ ์ง์ง ๋๋จํ ๊ฒ ๊ฐ๋ค. ๋๋ ๋ ๋ถ๋ฐํด์ผ๊ฒ ๋ค ๐ค
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 7569_ํ ๋งํ (0) | 2022.03.22 |
---|---|
[Baekjoon] 7576_ํ ๋งํ (0) | 2022.03.21 |
[Baekjoon] 4889_์์ ์ ์ธ ๋ฌธ์์ด (0) | 2022.03.18 |
[Baekjoon] 1850_์ต๋๊ณต์ฝ์ (0) | 2022.03.17 |
[Baekjoon] 2553_๋ง์ง๋ง ํฉํ ๋ฆฌ์ผ ์ (0) | 2022.03.16 |