πŸ‘©β€πŸŽ“κ³΅λΆ€ - 2024.01.10 였늘의 λ°±μ€€ λ¬Έμ œν’€μ΄

유령개·2024λ…„ 1μ›” 10일
0

PS-μ•Œκ³ λ¦¬μ¦˜2

λͺ©λ‘ 보기
10/34
post-thumbnail

3184번 - μ–‘

λ‹€μ‹œ BFS λ¬Έμ œμž…λ‹ˆλ‹€!

λΉˆκ³΅κ°„ / μšΈνƒ€λ¦¬ / μ–‘ / λŠ‘λŒ€λ‘œ 이루어진 κ·Έλž˜ν”„κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ 날이 밝은 ν›„ μ΅œμ’…μ μœΌλ‘œ μ‚΄μ•„λ‚¨λŠ” 생물과 κ·Έ μƒλ¬Όμ˜ 마릿수λ₯Ό 좜λ ₯ν•˜λ©΄ λ˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

μšΈνƒ€λ¦¬λ‘œ 가두어진 곡간을 'ν•œ 곡간'이라고 κ·œμ •ν•˜λ©°, ν•œ 곡간 λ‚΄ μ–‘μ˜ μˆ˜κ°€ λŠ‘λŒ€λ³΄λ‹€ λ§Žμ„ 경우 양이 κ·Έ 곡간 λ‚΄ λŠ‘λŒ€λ₯Ό μ«“μ•„λ‚΄κ³ , 그렇지 μ•Šμ„ 경우 (λŠ‘λŒ€μ™€ μ–‘μ˜ μˆ˜κ°€ λΉ„λ“±ν•˜κ±°λ‚˜ λŠ‘λŒ€μ˜ μˆ˜κ°€ 더 λ§Žμ€ 경우)μ—λŠ” λŠ‘λŒ€κ°€ κ·Έ 곡간 λ‚΄μ˜ 양을 λͺ¨λ‘ μž‘μ•„λ¨ΉμŠ΅λ‹ˆλ‹€.

...#..
.##v#.
#v.#.#
#.o#.#
.###.#
...###

μ΄λ ‡κ²Œ 생긴 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€κ°€ μžˆλ‹€λ©΄ 1번 곡간엔 λŠ‘λŒ€ ν•œλ§ˆλ¦¬κ°€ 가둬져 μžˆμœΌλ‹ˆκΉŒ λŠ‘λŒ€ + 1, 2번 곡간엔 λŠ‘λŒ€ ν•˜λ‚˜μ™€ μ–‘ ν•˜λ‚˜κ°€ κ°‡ν˜€μžˆμœΌλ‹ˆκΉŒ λŠ‘λŒ€κ°€ 양을 μž‘μ•„λ¨Ήμ–΄μ„œ λŠ‘λŒ€ + 1, μ΅œμ’…μ μœΌλ‘œ λŠ‘λŒ€ 2λ§ˆλ¦¬κ°€ μ‚½λ‹ˆλ‹€.

이제 μ½”λ“œλ‘œ λ“€μ–΄κ°€λ΄…μ‹œλ‹€.

R,C = map(int,input().split())
field = []
sheep_ans = 0
wolf_ans = 0
visited = [[0]*C for _ in range(R)]
que = deque()
for _ in range(R):
    a = list(input())
    field.append(a)

λ¨Όμ € κ·Έλž˜ν”„μ˜ 크기와 μ΅œμ’…μ μœΌλ‘œ μ–‘κ³Ό λŠ‘λŒ€μ˜ 마릿수λ₯Ό ν‘œν˜„ν•΄μ€„ λ³€μˆ˜, 그리고 bfsλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•œ que와 λ°±νŠΈλž˜ν‚ΉμœΌλ‘œ λ°©λ¬Έ μ—¬λΆ€λ₯Ό ν‘œμ‹œν•΄μ€„ visited 등을 μ„ μ–Έν•˜κ² μŠ΅λ‹ˆλ‹€.

for i in range(R):
    for j in range(C):
        if field[i][j] == 'v' or field[i][j] == 'o':
            bfs(i,j)

그리고 κ·Έλž˜ν”„λ₯Ό ν•˜λ‚˜μ”© 돌며 μ–‘μ΄λ‚˜ λŠ‘λŒ€κ°€ λ‚˜μ˜€λŠ” μˆœκ°„λΆ€ν„° 탐색을 μ‹œμž‘ν•˜κ² μŠ΅λ‹ˆλ‹€.

from collections import deque
dx = [-1,1,0,0]
dy = [0,0,1,-1]

BFS μ‚¬μš©μ„ μœ„ν•΄ deque와 μƒν•˜μ’Œμš° 선언을 μ‹€μ‹œν•˜κ³ 

def bfs(x,y):
    que.append([x,y])
    global sheep_ans,wolf_ans
    wolf = 0
    sheep = 0
    visited[x][y] = 1
    if field[x][y] == 'o':
        sheep += 1
    else:
        wolf += 1

본격적으둜 BFS ν•¨μˆ˜ μž‘μ„±μ„ μ‹œμž‘ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

.#.
#v#
.#.

일단 μœ„μ™€κ°™μ΄ λŠ‘λŒ€ λ˜λŠ” 양이 ν˜Όμžμ„œ κ°‡ν˜€μžˆλŠ” 상황이 λ°œμƒ ν•  수 μžˆμœΌλ―€λ‘œ 맨 μ²˜μŒμ— 받은 μΈλ±μŠ€λŠ” λ°©λ¬Έ 처리λ₯Ό ν•˜κ³  ν•΄λ‹Ή μΈλ±μŠ€κ°€ 양인지 λŠ‘λŒ€μΈμ§€ νŒλ‹¨ν•΄μ„œ λŠ‘λŒ€μ˜ μ§€μ—­λ³€μˆ˜ or μ–‘μ˜ μ§€μ—­λ³€μˆ˜ + 1을 해주도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

    while que:
        x,y = que.popleft()
        for i in range(4):
            nx = dx[i] + x
            ny = dy[i] + y
            if nx<0 or ny<0 or nx>=R or ny>=C:
                continue

λ‹€μŒμœΌλ‘œ BFS νƒμƒ‰μ˜ 기본적인 과정이라 ν•  수 μžˆλŠ” μƒν•˜μ’Œμš° 4λ°©ν–₯ 탐색을 μ‹€μ‹œν•΄μ£Όκ³ 

            if not visited[nx][ny]:
                if field[nx][ny] == '#':
                    visited[nx][ny] = 1
                    continue 

μšΈνƒ€λ¦¬κ°€ λ‚˜μ˜¨λ‹€λ©΄ λ°©λ¬Έ μ—¬λΆ€λ§Œ ν‘œκΈ°ν•΄μ£Όκ³  continue둜 μŠ€ν‚΅ (κ³΅κ°„λ§Œ λ‚˜λˆŒ 뿐이지 λ”±νžˆ ν• κ²Œ μ—†μŒ)

                if field[nx][ny] == '.':
                    visited[nx][ny] = 1
                    que.append([nx,ny])

빈 곡간이 λ‚˜μ˜¨λ‹€λ©΄ λ°©λ¬Έ μ—¬λΆ€ ν‘œκΈ°ν•΄μ£Όκ³  λ‹€μŒ 탐색지점에 μΆ”κ°€

                if field[nx][ny] == 'v':
                    visited[nx][ny] = 1
                    field[nx][ny] = 'chk'
                    wolf += 1
                    que.append([nx,ny])

λ§Œμ•½ λŠ‘λŒ€κ°€ λ‚˜μ˜¨λ‹€λ©΄ λ°©λ¬Έ μ—¬λΆ€ ν‘œκΈ°ν•΄μ£Όκ³  ν•΄λ‹Ή 인덱슀 μž¬νƒμƒ‰μ„ ν•˜μ§€ μ•Šλ„λ‘ λ‹€λ₯Έ λ³€μˆ˜λ‘œ μΉ˜ν™˜, 그리고 ν•΄λ‹Ή ꡬ역 내에 λŠ‘λŒ€κ°€ μžˆλ‹€λŠ” λœ»μ΄λ‹ˆκΉŒ λŠ‘λŒ€μ˜ μ§€μ—­λ³€μˆ˜ + 1 ν•˜κ³  λ‹€μŒ 탐색지점에 μΆ”κ°€

                if field[nx][ny] == 'o':
                    visited[nx][ny] = 1
                    field[nx][ny] = 'chk'
                    sheep += 1
                    que.append([nx,ny])

λ§Œμ•½ 양이 λ‚˜μ˜¨λ‹€λ©΄ λ°©λ¬Έ μ—¬λΆ€ ν‘œκΈ°ν•΄μ£Όκ³  ν•΄λ‹Ή 인덱슀 μž¬νƒμƒ‰μ„ ν•˜μ§€ μ•Šλ„λ‘ λ‹€λ₯Έ λ³€μˆ˜λ‘œ μΉ˜ν™˜, 그리고 ν•΄λ‹Ή ꡬ역 내에 양이 μžˆλ‹€λŠ” λœ»μ΄λ‹ˆκΉŒ μ–‘μ˜ μ§€μ—­λ³€μˆ˜ + 1 ν•˜κ³  λ‹€μŒ 탐색지점에 μΆ”κ°€

ν•˜λ©΄ λ©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ 저희가 μž‘μ„±ν•œκ±΄ μ§€μ—­λ³€μˆ˜, κ·ΈλŸ¬λ‹ˆκΉŒ ν•΄λ‹Ή ꡬ역 'λ‚΄'의 μ–‘κ³Ό λŠ‘λŒ€μ˜ λ§ˆλ¦Ώμˆ˜μ΄λ―€λ‘œ

    if sheep > wolf:
        sheep_ans += sheep 
    else:
        wolf_ans += wolf 

μ–‘μ˜ λ§ˆλ¦Ώμˆ˜κ°€ λŠ‘λŒ€λ³΄λ‹€ λ§Žλ‹€λ©΄ λŠ‘λŒ€λ₯Ό μ«“μ•„λ‚΄λ―€λ‘œ μ–‘μ˜ μ΅œμ’…κ°’μ— ν˜„ ꡬ역 λ‚΄ μ–‘μ˜ 마릿수,
μ•„λ‹ˆλΌλ©΄ λŠ‘λŒ€κ°€ 양을 λ‹€ μž‘μ•„λ¨ΉμœΌλ―€λ‘œ λŠ‘λŒ€μ˜ μ΅œμ’…κ°’μ— ν˜„ ꡬ역 λ‚΄ λŠ‘λŒ€μ˜ 마릿수λ₯Ό μΆ”κ°€ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

print(sheep_ans,wolf_ans)

λ§ˆμ§€λ§‰μœΌλ‘œ 좜λ ₯ν•˜λ©΄ 닡이 μ •μƒμ μœΌλ‘œ λ‚˜μ˜€λŠ” κ±Έ 확인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


profile
ν•œλ¦ΌλŒ€ν•™κ΅ μ •λ³΄κ³Όν•™λŒ€ 2ν•™λ…„ μž¬ν•™μ€‘ / 윑ꡰ μ •λ³΄λ³΄ν˜Έλ³‘ 22-2κΈ°

0개의 λŒ“κΈ€