๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 10026_์ ๋ก์ƒ‰์•ฝ

๋ฟŒ์•ผ._. 2022. 3. 20. 16:35

Gold V

๋ฌธ์ œ(์ถœ์ฒ˜: 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๋กœ ๋ฐ”๊ฟ”์ฃผ๋„๋ก ํ–ˆ๋”๋‹ˆ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 


์ƒ๊ฐ๐Ÿค”

 

์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ์ œ์ถœํ•˜๊ณ  ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์•ˆ ๋ฏฟ๊ฒจ ๋‹ค์‹œ ์ œ์ถœํ•ด๋ดค๋‹ค.. ๐Ÿ˜ฅ

ํ•œ ์ค„ ์ฐจ์ด๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๊ฐˆ๋ฆฌ๋‹ค๋‹ˆ ๊ทธ๋ž˜๋„ ์ดํ•ด ์™„๋ฃŒ -!

 

์ด๋Ÿฐ ๊ฑฐ ์•Œ๋ ค์ฃผ๋Š” ์‚ฌ๋žŒ์€ ์ง„์งœ ๋Œ€๋‹จํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋‚˜๋„ ๋” ๋ถ„๋ฐœํ•ด์•ผ๊ฒ ๋‹ค ๐Ÿค”