์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿฅš/๋ฌธ์ œํ’€์ด (Python)

[Baekjoon]16234. ์ธ๊ตฌ์ด๋™ (Gold_4) 2024/4/15

๐Ÿช„ํ•˜๋ฃจ๐Ÿช„ 2024. 4. 15. 22:32
728x90
๋ฌธ์ œ ์ œ๋ชฉ ์ •๋‹ต๋ฅ  ๋‚œ์ด๋„
์ธ๊ตฌ์ด๋™ 39% Gold_4

 

๋ฌธ์ œ์š”์•ฝ

์ •์‚ฌ๊ฐํ˜• ๋•…์˜ ํฌ๊ธฐ N, ์ตœ์†Œ ์ธ๊ตฌ์ฐจ์ด L, ์ตœ๋Œ€ ์ธ๊ตฌ์ฐจ์ด R์ด ์ฒซ ๋ฒˆ์งธ ์ค„์— ์ฃผ์–ด์ง„๋‹ค.

1~N+1์ค„์—๋Š” ๋‚˜๋ผ๋ณ„ ์ธ๊ตฌ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๊ตญ๊ฒฝ์„ ์„ ๊ณต์œ ํ•˜๋Š” ๋‘ ๋‚˜๋ผ์˜ ์ธ๊ตฌ ์ฐจ์ด๊ฐ€ L์ด์ƒ R์ดํ•˜์ด๋ฉด ๋‘ ๋‚˜๋ผ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ตญ๊ฒฝ์„ ์„ ํ•˜๋ฃจ๋™์•ˆ ์—ฐ๋‹ค.

๊ตญ๊ฒฝ์„ ์ด ์—ด๋ ค์žˆ๊ณ , ์ธ์ ‘ํ•œ ์นธ์„ ์ด์šฉํ•ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋‚˜๋ผ๋“ค์„ ์—ฐํ•ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์—ฐํ•ฉํ•˜๋Š” ๋‚˜๋ผ์˜ ์ธ๊ตฌ์ˆ˜๋Š” sum(์—ฐํ•ฉ ์ธ๊ตฌ์ˆ˜)/(์—ฐํ•ฉํ•˜๋Š” ๋‚˜๋ผ ์ˆ˜)์ด๋‹ค.

์ธ๊ตฌ ์ด๋™์ด ๋ฐœ์ƒํ•˜์ง€ ๋ชปํ• ๋•Œ๊นŒ์ง€ ์ธ๊ตฌ ์ด๋™์„ ์ง€์†ํ•œ๋‹ค.
์กฐ๊ฑด 1) 1 <=N <=50, 1 <=L <=R <=100, 0 <=์ธ๊ตฌ์ˆ˜ <=100 

 

์ธ๊ตฌ์ด๋™์„ ์ง„ํ–‰ํ•˜๋Š” ๋‚ ์งœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ๋ผ 

 

ํ’€์ด

Step1. ์—ฐํ•ฉ์€ ์ƒ, ํ•˜, ์ขŒ, ์šฐ๋กœ ์ด๋ฃจ์–ด์ง์œผ๋กœ bfs์ด์šฉ

  • bfs(graph, visited, now_idx)


Step2. ์ข…๋ฃŒ์กฐ๊ฑด ์ƒ๊ฐ : break_flag ์ด์šฉ

  • ๋ชจ๋“  row, col์— ๋Œ€ํ•ด bfs๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฉด ์ข…๋ฃŒํ•œ ๋’ค, ํ•ด๋‹น ๋‚ ์งœ ๋ฐ˜ํ™˜

 

์ฝ”๋“œ

N, L, R = list(map(int, input().split()))
population_list = [[] for _ in range(N)]
for row_idx in range(N):
    population_list[row_idx] = list(map(int, input().split()))
  
def bfs(graph, visited, now_row, now_col, L, R):
    bfs_stack = [[now_row, now_col]]
    answer = [[now_row, now_col]]

    while len(bfs_stack) > 0:
        x, y = bfs_stack.pop()
        now_value = graph[x][y]
        # ์ƒ
        if x > 0:
            if visited[x-1][y] == 0 and abs(now_value-graph[x-1][y]) >= L and abs(now_value-graph[x-1][y]) <= R:
                visited[x-1][y] = 1
                bfs_stack.append([x-1, y])
                answer.append([x-1, y])
        # ํ•˜
        if x < len(graph)-1:
            if visited[x+1][y] == 0 and abs(now_value-graph[x+1][y]) >= L and abs(now_value-graph[x+1][y]) <= R:
                visited[x+1][y] = 1
                bfs_stack.append([x+1, y])
                answer.append([x+1, y])
        # ์ขŒ
        if y > 0:
            if visited[x][y-1] == 0 and abs(now_value-graph[x][y-1]) >= L and abs(now_value-graph[x][y-1]) <= R:
                visited[x][y-1] = 1
                bfs_stack.append([x, y-1])
                answer.append([x, y-1])
        # ์šฐ
        if y < len(graph)-1:
            if visited[x][y+1] == 0 and abs(now_value-graph[x][y+1]) >= L and abs(now_value-graph[x][y+1]) <= R:
                visited[x][y+1] = 1
                bfs_stack.append([x, y+1])
                answer.append([x, y+1])

    if len(answer) > 1:
        move_value = sum([population_list[row][col]
                         for row, col in answer])//len(answer)
        for row, col in answer:
            population_list[row][col] = move_value
        return False

    return True


day = 0
while day <= 2000:
    break_flag = True
    visited = [[0 for _ in range(N)] for _ in range(N)]
    for row_idx in range(N):
        for col_idx in range(N):
            if visited[row_idx][col_idx] == 0:
                visited[row_idx][col_idx] = 1
                break_flag = break_flag & bfs(
                    population_list, visited, row_idx, col_idx, L, R)
    if break_flag == False:
        day += 1
    else:
        break
print(day)
728x90