๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

[๋ฐฑ์ค€] 14503 ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2022. 5. 23. 19:26

https://www.acmicpc.net/problem/14503

 

14503๋ฒˆ: ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฒญ์†Œํ•˜๋Š” ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์žฅ์†Œ๋Š” N×M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, 1×1ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด

www.acmicpc.net

ํ’€์ด ๊ณผ์ •

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ ์ž‘๋™๋ฐฉ์‹์„ ๋ณด๊ณ  ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ  ํ‘ผ๋‹ค.

ํฌ๊ฒŒ ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ๊ฐ€ ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „ํ•˜๋Š” ํŒŒํŠธ(a)์™€ ํ›„์ง„ํ•˜๋Š” ํŒŒํŠธ(b)๋กœ ๋‘๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.
์ด ๋ฌธ์ œ๋Š” ๊ฒฝ๊ณ„๊ฐ€ ๋ชจ๋‘ ๋ฒฝ์œผ๋กœ ๋ง‰ํ˜€์žˆ์–ด ๋”ฐ๋กœ ์ œ์•ฝ์กฐ๊ฑด์€ ๋‹ฌ์ง€ ์•Š์•˜๋‹ค.
 
def clean(x,y,d,count):
    if area[x][y] == 0:
        area[x][y] = 2

ํ•จ์ˆ˜๋Š” x,y ์ขŒํ‘œ , ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅd, ๊ทธ๋ฆฌ๊ณ  2a๋‹จ๊ณ„๊ฐ€ ์‹คํ–‰๋˜๋Š” ํšŸ์ˆ˜ count๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.

 

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋งจ ์ฒ˜์Œ ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ๋นˆ๊ณต๊ฐ„์— ์žˆ์„๋•Œ ์ฒญ์†Œ๋ฅผ ์‹œ์ผœ์ค€๋‹ค. ์ด๋•Œ ์ฒญ์†Œํ–ˆ๋‹ค๋Š” ๊ฒƒ์„

ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋นˆ๊ณต๊ฐ„(0)๊ณผ ๋ฒฝ(1)๊ณผ ๋‹ค๋ฅธ ์ˆซ์ž์ธ 2๋ฅผ ์ž…๋ ฅ ํ•ด์ค€๋‹ค.

 

    if count <= 3:
        if d == 0:
            if area[x][y - 1] == 0:
                #print("์„œ์ชฝ์œผ๋กœ ๊ฐ€์„œ ์ฒญ์†Œ")
                clean(x,y - 1,3,0)
            else:
                #print("์„œ์ชฝ์œผ๋กœ ๋Œ๊ธฐ")
                clean(x,y,3,count + 1)

        elif d == 3:
            if area[x + 1][y] == 0:
                #print("๋‚จ์ชฝ์œผ๋กœ ๊ฐ€์„œ ์ฒญ์†Œ")
                clean(x + 1,y,2,0)
            else:
                #print("๋‚จ์ชฝ์œผ๋กœ ๋Œ๊ธฐ")
                clean(x,y,2,count + 1)

์ดํ›„ ์ฝ”๋“œ ์ž‘์„ฑ์ˆœ์„œ๋Š” 2bํŒŒํŠธ๊ฐ€ ๋จผ์ €์ง€๋งŒ ์„ค๋ช…์„ ์œ„ํ•ด 2aํŒŒํŠธ๋ฅผ ๋จผ์ € ํ’€์ดํ•œ๋‹ค.

๋จผ์ € ํšŒ์ „ ํšŸ์ˆ˜(count)๊ฐ€ 3๋ฒˆ ์ดํ•˜์ด๋ฉด ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ(d)์— ๋”ฐ๋ผ if๋ฌธ์„ ์‹คํ–‰์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

 

์™ผ์ชฝ ๊ณต๊ฐ„์ด ๋น„์—ฌ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์„œ ์ฒญ์†Œํ•˜๊ณ  ์•„๋‹ˆ๋ผ๋ฉด ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๊ธฐ๋งŒํ•˜๊ณ  count๊ฐ’๋งŒ 1 ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค

    if count == 4:
        #print("4๋ฒˆ ์‹คํ–‰")
        if d == 0:
            if area[x + 1][y] == 1:
                #print("์ข…๋ฃŒ")
                return
            else:
                clean(x + 1,y,0,0)

์ดํ›„ ํšŒ์ „ ํšŸ์ˆ˜(count)๊ฐ€ 4๊ฐ€ ๋˜๋ฉด 2bํŒŒํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์˜ ๋’ค์ชฝ์ด ๋ฒฝ(1)์ด๋ผ๋ฉด ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ ์ž‘๋™์„ ๋ฉˆ์ถ”๊ณ (ํ•จ์ˆ˜์ข…๋ฃŒ), ์•„๋‹ˆ๋ผ๋ฉด ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•˜๊ณ  ๋’ค๋กœ๊ฐ„๋‹ค.

์ด๋•Œ ํšŒ์ „ ํšŸ์ˆ˜(count)๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค€๋‹ค.

 

result = 0
for i in range(N):
    for j in range(M):
        if area[i][j] == 2:
            result += 1
print(result)

์ดํ›„ ์ด์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฐ’์ด 2์ธ๊ฒƒ์„ ์นด์šดํŠธํ•ด์„œ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

 

ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑํ•œ ์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. sys๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ๊ท€๊นŠ์ด๋ฅผ ์ฆ๊ฐ€์‹œ์ผฐ๋‹ค.

import sys
sys.setrecursionlimit(10**6)
N, M = map(int,input().split())
r,c,di = map(int,input().split())
# 0 ๋ถ, 1 ๋™, 2 ๋‚จ, 3์„œ
area = []
for _ in range(N):
    area.append([int(x) for x in input().split()])

def clean(x,y,d,count):
    if area[x][y] == 0:
        area[x][y] = 2

    if count == 4:
        #print("4๋ฒˆ ์‹คํ–‰")
        if d == 0:
            if area[x + 1][y] == 1:
                #print("์ข…๋ฃŒ")
                return
            else:
                clean(x + 1,y,0,0)

        elif d == 3:
            if area[x][y + 1] == 1:
                #print("์ข…๋ฃŒ")
                return
            else:
                clean(x,y + 1,3,0)

        elif d == 2:
            if area[x - 1][y] == 1:
                #print("์ข…๋ฃŒ")
                return
            else:
                clean(x - 1,y,2,0)

        elif d == 1:
            if area[x][y - 1] == 1:
                #print("์ข…๋ฃŒ")
                return
            else:
                clean(x,y - 1,1,0)

    if count <= 3:
        if d == 0:
            if area[x][y - 1] == 0:
                #print("์„œ์ชฝ์œผ๋กœ ๊ฐ€์„œ ์ฒญ์†Œ")
                clean(x,y - 1,3,0)
            else:
                #print("์„œ์ชฝ์œผ๋กœ ๋Œ๊ธฐ")
                clean(x,y,3,count + 1)

        elif d == 3:
            if area[x + 1][y] == 0:
                #print("๋‚จ์ชฝ์œผ๋กœ ๊ฐ€์„œ ์ฒญ์†Œ")
                clean(x + 1,y,2,0)
            else:
                #print("๋‚จ์ชฝ์œผ๋กœ ๋Œ๊ธฐ")
                clean(x,y,2,count + 1)

        elif d == 2:
            if area[x][y + 1] == 0:
                #print("๋™์ชฝ์œผ๋กœ ๊ฐ€์„œ ์ฒญ์†Œ")
                clean(x,y + 1,1,0)
            else:
                #print("๋™์ชฝ์œผ๋กœ ๋Œ๊ธฐ")
                clean(x,y,1,count + 1)

        elif d == 1:
            if area[x - 1][y] == 0:
                #print("๋ถ์ชฝ์œผ๋กœ ๊ฐ€์„œ ์ฒญ์†Œ")
                clean(x - 1,y,0,0)
            else:
                #print("๋ถ์ชฝ์œผ๋กœ ๋Œ๊ธฐ")
                clean(x,y,0,count + 1)

clean(r,c,di,0)
#print(area)
result = 0
for i in range(N):
    for j in range(M):
        if area[i][j] == 2:
            result += 1
print(result)