We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 16932_๋ชจ์–‘๋งŒ๋“ค๊ธฐ - ํŒŒ์ด์ฌ

Redddy 2022. 9. 30. 21:53

๐Ÿ”ˆ ๋ฌธ์ œ

N×M์ธ ๋ฐฐ์—ด์—์„œ ๋ชจ์–‘์„ ์ฐพ์œผ๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ์นธ์—๋Š” 0๊ณผ 1 ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ๋‘ ์นธ์ด ์„œ๋กœ ๋ณ€์„ ๊ณต์œ ํ• ๋•Œ, ๋‘ ์นธ์„ ์ธ์ ‘ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.
1์ด ๋“ค์–ด ์žˆ๋Š” ์ธ์ ‘ํ•œ ์นธ๋ผ๋ฆฌ ์—ฐ๊ฒฐํ–ˆ์„ ๋•Œ, ๊ฐ๊ฐ์˜ ์—ฐ๊ฒฐ ์š”์†Œ๋ฅผ ๋ชจ์–‘์ด๋ผ๊ณ  ๋ถ€๋ฅด์ž. ๋ชจ์–‘์˜ ํฌ๊ธฐ๋Š” ๋ชจ์–‘์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” 1์˜ ๊ฐœ์ˆ˜์ด๋‹ค.
๋ฐฐ์—ด์˜ ์นธ ํ•˜๋‚˜์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ์–‘์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•ด๋ณด์ž.

 

๐Ÿ“์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฐฐ์—ด์˜ ํฌ๊ธฐ N๊ณผ M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

 

๐Ÿ“‘์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜ ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ์–‘์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿšซ์ œํ•œ

$ 2 <= N, M <= 1000 $
0๊ณผ 1์˜ ๊ฐฏ์ˆ˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์ด๋‹ค.

 

๐Ÿ“š ๋ฌธ์ œ ํ’€์ด

 

๋”ฑ ๋ฌธ์ œ๋ฅผ ๋ณด์ž๋งˆ์ž ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผ ํ• ์ง€ ๊ฐ์ด์™”๋‹ค.

๋ฐฉ๋ฌธ์ฒดํฌ ๋ฐฐ์—ด์— ํ˜„์žฌ ์ž๊ธฐ๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน์„ ๋‹ด์•„ ๋‘”๋’ค ๊ทธ ๊ทธ๋ฃน์˜ 1์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋”ฐ๋กœ dict์— ๋‹ด์•„ ๋†“๋Š”๋‹ค. ์ฆ‰ ์ด์ค‘๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ๋Œ๋ฉด์„œ 1์ด๋ผ๋ฉด BFS๋ฅผ ๋Œ๋ ค ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์ฃผ์—ˆ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์— ๊ฐ๊ฐ ์†ํ•œ ๊ทธ๋ฃธ์„ ๋‹ด์•„๋‘์—ˆ๋‹ค๋ฉด, ์ด์ œ ๋‹ค์‹œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ์•„์„œ 0์ธ ๊ณณ์„ ์ฐพ๋Š”๋‹ค. ๋งŒ์•ฝ 0์ด๋ผ๋ฉด ์ƒํ•˜์ขŒ์šฐ์— ์–ด๋–ค ๊ทธ๋ฃน์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•ด์ค€๋‹ค. ์ƒํ•˜์ขŒ์šฐ์— ๊ฐ™์€ ๊ทธ๋ฃน์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋Š”๋ฐ ๊ฐ™์€ ๊ทธ๋ฃน์€ ๋‹ค์‹œ๋Š” ํฌํ•จ ์•ˆ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ์ƒํ•˜์ขŒ์šฐ์— ์žˆ๋Š” ๊ทธ๋ฃน์„ ํŒŒ์•…ํ–ˆ์œผ๋ฉด dict์— ์ €์žฅํ•ด๋†“์€ ๊ฐ๊ฐ 1์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฐฏ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€ ๋”ํ•ด์ค€๋’ค ์ตœ๋Œ€๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ์—ˆ๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from collections import deque
import sys
input= sys.stdin.readline
 
# 1๊ฐฏ์ˆ˜ ๊ฐ๊ฐ ๋„ํ˜•์— ์นด์šดํŠธ
# ๋งˆ์ง€๋ง‰์—๋Š” 0๋งŒ ์ฐพ์•„ ๋‹ค๋‹ˆ๋ฉด์„œ ์ƒํ•˜์ขŒ์šฐ 1์˜ ์กฐ๊ฐ ๊ฐฏ์ˆ˜ ๋”ํ•จ
 
dx = [1,0,-1,0]
dy = [0,1,0,-1]
n,m = map(int,input().split())
graph = [list(map(int,input().split())) for _ in range(n)]
visited = [[0]*(m) for _ in range(n)]
 
dic = dict()
 
# 1์ด์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•œ ํƒ์ƒ‰ 
def bfs(a: int,b: int,c: int,pos: int)-> int:
    queue = deque()
    queue.append([a,b,c])
    visited[a][b] = pos
    cnt_tmp = 1
    while queue:
        x,y,cnt = queue.popleft()
 
        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]
            
            if nx < 0 or ny < 0 or nx >= n or ny >= m:
                continue
 
            if visited[nx][ny] == 0 and graph[nx][ny] == 1:
                cnt_tmp += 1
                queue.append([nx,ny,cnt+1])
                visited[nx][ny] = pos
    #print('last', cnt_tmp)
    # 1์˜ ๋ฌถ์Œ ๊ฐฏ์ˆ˜
    return cnt_tmp
 
# ๊ฐ๊ฐ์˜ 1๋ญ‰ํƒฑ์ด key๊ฐ’์€ idx๋กœ ๋‘์—ˆ๋‹ค.
idx = 1
for i in range(n):
    for j in range(m):
        # 1์ด๊ณ , ์•„์ง ๋ฐฉ๋ฌธ์•ˆํ–ˆ๋‹ค๋ฉด
        if graph[i][j] == 1 and visited[i][j] == 0:
            tmp = bfs(i,j,1,idx) # 1์˜ ๋ญ‰ํƒฑ์ด ๊ฐฏ์ˆ˜
            dic[idx] = tmp # dict์— ์ €์žฅ 
            idx += 1 
tot = []
# ๋‹ค์‹œ ๋ฐ˜๋ณต๋ฌธ ๋Œ์•„ 0์„ ์ฐพ๋Š”๋‹ค.
for i in range(n):
    for j in range(m):
        if graph[i][j] == 0:
            side =set()
            # ์ƒํ•˜์ขŒ์šฐ 1๋ญ‰ํƒฑ์ด ํ‚ค๊ฐ’์„ side์— 
            for k in range(4):
                nx = i+dx[k]
                ny = j+dy[k]
 
                if nx < 0 or ny < 0 or nx >= n or ny >= m:
                    continue
                if visited[nx][ny] != 0:
                    side.add(visited[nx][ny])
            # tot๋Š” ๋ชจ๋“  0์˜ ์ƒํ•˜์ขŒ์šฐ list
            if side not in tot:
                tot.append(side)
#print(tot)
result = []
for ans in tot:
    for_sum = 0
    ans = list(ans)
    # ํ‚ค๊ฐ’ ๋ถˆ๋Ÿฌ์„œ 0์„ 1๋กœ ๋ฐ”๊พธ๋ฉด ๋ช‡์ธ์ง€ ํ™•์ธ
    for i in ans:
        for_sum += dic[i]
    #print(for_sum)
    result.append(for_sum)
 
print(max(result)+1)
cs

์œ„์˜ ์ฝ”๋“œ๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

์ด์ค‘๋ฐ˜๋ณต๋ฌธ์„ ๋‘๋ฒˆ์ด๋‚˜ ๋Œ์•˜๊ณ , (1์„ ์ฐพ๊ธฐ ์œ„ํ•ด, 0์„ ์ฐพ๊ธฐ ์œ„ํ•ด), ์—ฐ์‚ฐ์„ ๋„ˆ๋ฌด ์„ธ๋ถ„ํ™” ํ•˜์—ฌ ๋ฐ˜๋ณต๋ฌธ์„ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ๋Œ๊ฒŒํ•˜์˜€๋‹ค.

๊ทธ๋ž˜์„œ 1์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋•Œ 0์˜ ์œ„์น˜๋„ stk๋ผ๋Š” list์— ์ €์žฅํ•ด๋‘”๋’ค ๋‚˜์ค‘์— ๋‹ค์‹œ ์ด์ค‘๋ฐ˜๋ณต๋ฌธ์„ ๋Œ์ง€ ์•Š๊ฒŒ ์ตœ์ ํ™” ํ•˜์˜€๊ณ , ๋˜ ์„ธ๋ถ„ํ™”๋œ ๊ฒƒ๋“ค์„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜์˜€๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from collections import deque
import sys
input= sys.stdin.readline
 
 
dx = [1,0,-1,0]
dy = [0,1,0,-1]
n,m = map(int,input().split())
graph = [list(map(int,input().split())) for _ in range(n)]
visited = [[0]*(m) for _ in range(n)]
 
dic = dict()
# 1๊ฐฏ์ˆ˜ ๊ฐ๊ฐ ๋„ํ˜•์— ์นด์šดํŠธ
# ๋งˆ์ง€๋ง‰์—๋Š” 0๋งŒ ์ฐพ์•„ ๋‹ค๋‹ˆ๋ฉด์„œ ์ƒํ•˜์ขŒ์šฐ 1์˜ ์กฐ๊ฐ ๊ฐฏ์ˆ˜ ๋”ํ•จ
 
def bfs(a,b,c,pos):
    queue = deque()
    queue.append([a,b,c])
    visited[a][b] = pos
    cnt_tmp = 1
    while queue:
        x,y,cnt = queue.popleft()
        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]
            
            if nx < 0 or ny < 0 or nx >= n or ny >= m:
                continue
 
            if visited[nx][ny] == 0 and graph[nx][ny] == 1:
                cnt_tmp += 1
                queue.append([nx,ny,cnt+1])
                visited[nx][ny] = pos
    return cnt_tmp
idx = 1
stk = []
for i in range(n):
    for j in range(m):
        if graph[i][j] == 1 and visited[i][j] == 0:
            dic[idx] = bfs(i,j,1,idx)
            idx += 1
        # 0์ด๋ฉด stk์— ์ €์žฅ
        elif graph[i][j] == 0:
            stk.append([i,j])
res = 0
for i,j in stk:
 
    four = 0 # ์ƒํ•˜์ขŒ์šฐ 1์˜ ๊ฐฏ์ˆ˜ ํ•ฉ
    pre = [] # ๊ฐ™์€ ์—ฐ์‚ฐ ๋‘๋ฒˆ ๋ฐฉ์ง€ํ•˜๊ธฐ 
    for k in range(4):
        nx = i+dx[k]
        ny = j+dy[k]
        if nx < 0 or ny < 0 or nx >= n or ny >= m:
            continue
        level = visited[nx][ny]
        if level!=0 and level not in pre:
            four += dic[level]
            pre.append(level)
        #print('four', four)
    if res < four+1:
        res = four+1
print(res)
cs

 

์ด๋ ‡๊ฒŒ ์ตœ์ ํ™”ํ•˜๋‹ˆ ํ†ต๊ณผํ•˜์˜€๋‹ค!!ใ…Ž

 

๐Ÿญ ์‹œํ–‰์ฐฉ์˜ค

 

๐Ÿ”— ๋ฌธ์ œ๋งํฌ ๋ชจ์–‘ ๋งŒ๋“ค๊ธฐ

 

16932๋ฒˆ: ๋ชจ์–‘ ๋งŒ๋“ค๊ธฐ

N×M์ธ ๋ฐฐ์—ด์—์„œ ๋ชจ์–‘์„ ์ฐพ์œผ๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ์นธ์—๋Š” 0๊ณผ 1 ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ๋‘ ์นธ์ด ์„œ๋กœ ๋ณ€์„ ๊ณต์œ ํ• ๋•Œ, ๋‘ ์นธ์„ ์ธ์ ‘ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค. 1์ด ๋“ค์–ด ์žˆ๋Š” ์ธ์ ‘ํ•œ ์นธ๋ผ๋ฆฌ ์—ฐ๊ฒฐํ–ˆ์„ ๋•Œ, ๊ฐ๊ฐ์˜

www.acmicpc.net