๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 14503_๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

๋ฟŒ์•ผ._. 2022. 5. 5. 00:06

Gold V

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/14503)

<๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ>

๋ฌธ์ œ 

 

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

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์žฅ์†Œ๋Š” N×M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, 1 ×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นธ์€ ๋ฒฝ ๋˜๋Š” ๋นˆ์นธ์ด๋‹ค. ์ฒญ์†Œ๊ธฐ๋Š” ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์ด ์žˆ์œผ๋ฉฐ, ์ด ๋ฐฉํ–ฅ์€ ๋™, ์„œ, ๋‚จ, ๋ถ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ง€๋„์˜ ๋ถ์ชฝ์—์„œ๋ถ€ํ„ฐ r๋ฒˆ์งธ, ์„œ์ชฝ์—์„œ๋ถ€ํ„ฐ c๋ฒˆ์งธ๋กœ ์œ„์น˜ํ•œ ์นธ์€ (r, c)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

1. ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฒญ์†Œํ•œ๋‹ค.
2. ํ˜„์žฌ ์œ„์น˜์—์„œ ๋‹ค์Œ์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ธ์ ‘ํ•œ ์นธ์„ ํƒ์ƒ‰ํ•œ๋‹ค.
   a. ํ˜„์žฌ ์œ„์น˜์˜ ๋ฐ”๋กœ ์™ผ์ชฝ์— ์•„์ง ์ฒญ์†Œํ•˜์ง€ ์•Š์€ ๋นˆ ๊ณต๊ฐ„์ด ์กด์žฌํ•œ๋‹ค๋ฉด, ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ ๋‹ค์Œ ํ•œ ์นธ์„ ์ „์ง„ํ•˜๊ณ  1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ๋‹ค. ์ด๋•Œ, ์™ผ์ชฝ์€ ํ˜„์žฌ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.
   b. 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฑฐ๋‚˜ ํ›„์ง„ํ•˜์ง€ ์•Š๊ณ  2a๋ฒˆ ๋‹จ๊ณ„๊ฐ€ ์—ฐ์†์œผ๋กœ ๋„ค ๋ฒˆ ์‹คํ–‰๋˜์—ˆ์„ ๊ฒฝ์šฐ, ๋ฐ”๋กœ ๋’ค์ชฝ์ด ๋ฒฝ์ด๋ผ๋ฉด ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ํ•œ ์นธ ํ›„์ง„ํ•œ๋‹ค.

 

 

์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (3 ≤ N, M ≤ 50)

๋‘˜์งธ ์ค„์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ขŒํ‘œ (r, c)์™€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ d๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. d๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋Š” ๋ถ์ชฝ์„, 1์ธ ๊ฒฝ์šฐ์—๋Š” ๋™์ชฝ์„, 2์ธ ๊ฒฝ์šฐ์—๋Š” ๋‚จ์ชฝ์„, 3์ธ ๊ฒฝ์šฐ์—๋Š” ์„œ์ชฝ์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์…‹์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์žฅ์†Œ์˜ ์ƒํƒœ๊ฐ€ ๋ถ์ชฝ๋ถ€ํ„ฐ ๋‚จ์ชฝ ์ˆœ์„œ๋Œ€๋กœ, ๊ฐ ์ค„์€ ์„œ์ชฝ๋ถ€ํ„ฐ ๋™์ชฝ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋นˆ์นธ์€ 0, ๋ฒฝ์€ 1๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ง€๋„์˜ ์ฒซ ํ–‰, ๋งˆ์ง€๋ง‰ ํ–‰, ์ฒซ ์—ด, ๋งˆ์ง€๋ง‰ ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์นธ์€ ๋ฒฝ์ด๋‹ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ƒํƒœ๋Š” ํ•ญ์ƒ ๋นˆ์นธ์ด๋‹ค.

 

์ถœ๋ ฅ 

 

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์ฒญ์†Œํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

 

 - my solution (Python)

import sys

if __name__=='__main__':
    n,m=map(int,sys.stdin.readline().split()) # ์„ธ๋กœ, ๊ฐ€๋กœ

    r,c,d=map(int,sys.stdin.readline().split()) # ์ขŒํ‘œ, ๋ฐฉํ–ฅ

    arr=[]
    visited=[[0]*m for i in range(n)] # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    for i in range(n):
        temp=list(map(int,sys.stdin.readline().split()))
        arr.append(temp)

    location=[r,c,d]
    visited[r][c] = 1
    answer=1
    cnt=0 # 2a๋ฒˆ ์‹คํ–‰ count

    while location:
        if location[2]==0: # ๋ถ -> ์™ผ์ชฝ
            x=location[0]
            y=location[1]-1
        elif location[2]==1: # ๋™ -> ์™ผ์ชฝ
            x=location[0]-1
            y=location[1]
        elif location[2]==2: # ๋‚จ -> ์™ผ์ชฝ
            x=location[0]
            y=location[1]+1
        else: # ์„œ -> ์™ผ์ชฝ
            x=location[0]+1
            y=location[1]

        if 0<=x<n and 0<=y<m:
            if visited[x][y]==0 and arr[x][y]==0: # ๋นˆ ๊ณต๊ฐ„ + ๋ฐฉ๋ฌธ x
                visited[x][y] = 1
                cnt=0
                answer += 1
                location[2]-=1 # ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „
                if location[2]<0:
                    location[2]=3
                location=[x,y,location[2]]
            else: 
                location[2]-=1 # ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „
                cnt+=1
                if location[2]<0:
                    location[2]=3
        if cnt==4: # 2a ์—ฐ์†์œผ๋กœ 4๋ฒˆ ์‹คํ–‰ -> ๋ฐ”๋กœ ๋’ค
            if location[2] == 0:  # ๋ถ
                x = location[0] +1
                y = location[1]
            elif location[2] == 1:  # ๋™
                x = location[0]
                y = location[1]-1
            elif location[2] == 2:  # ๋‚จ
                x = location[0] -1
                y = location[1]
            else:  # ์„œ
                x = location[0]
                y = location[1]+1

            if 0<=x<n and 0<=y<m:
                if arr[x][y]==1: # ๋ฒฝ
                    location=[]
                else: # ๋ฒฝ x -> ํ›„์ง„
                    location=[x,y,location[2]]
                    cnt=0
    print(answer)

 

ํ˜„์žฌ ๋ฐฉํ–ฅ์—์„œ ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „ํ•˜๋ฉด ์–ด๋Š ๋ฐฉํ–ฅ์ธ์ง€ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์ ค ์ค‘์š”ํ•˜๋‹ค.

 

  • ์„ธ๋กœ, ๊ฐ€๋กœ ํฌ๊ธฐ ์ž…๋ ฅ
  • ์ขŒํ‘œ, ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ ์ž…๋ ฅ
  • arr = ์žฅ์†Œ์˜ ์ƒํƒœ
    visited = ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    location = ํ˜„์žฌ ์œ„์น˜, ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ
    answer =  ์ฒญ์†Œํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜
    cnt = 2a๋ฒˆ ๋‹จ๊ณ„๊ฐ€ ์—ฐ์†์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ˆ˜
  • ์ž‘๋™์ด ๋ฉˆ์ถœ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 
    -> ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•  ์œ„์น˜๊ฐ€ ๋นˆ ๊ณต๊ฐ„์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉด ๋ฐฉ๋ฌธ ๋ฐ cnt ์ดˆ๊ธฐํ™”, ์ฒญ์†Œํ•˜๋Š” ์นธ +1, ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „/ ์ฒญ์†Œํ•˜์ง€ ์•Š์€ ๋นˆ ๊ณต๊ฐ„์ด ์•„๋‹ˆ๋ผ๋ฉด ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „๋งŒ
    -> 2a๋ฒˆ ๋‹จ๊ณ„๊ฐ€ ์—ฐ์†์œผ๋กœ 4๋ฒˆ ์‹คํ–‰๋˜์—ˆ์„ ๊ฒฝ์šฐ ํ˜„์žฌ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์—์„œ ๋’ค์ชฝ ์œ„์น˜๋ฅผ ๊ตฌํ•œ ํ›„ ๊ทธ ์œ„์น˜๊ฐ€ ๋ฒฝ์ด๋ผ๋ฉด ์ž‘๋™ ๋ฉˆ์ถค/ ๋ฒฝ์ด ์•„๋‹ˆ๋ผ๋ฉด ํ›„์ง„
  • answer ์ถœ๋ ฅ

 

โ“ ์–ด๋Š ๋ถ€๋ถ„์„ ๋†“์ณค๋Š”๊ฐ€?

ํ•œ ์นธ ํ›„์ง„ํ•  ๋•Œ ๋ฒฝ์ด ์•„๋‹ˆ๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์ด๋ผ๋„ ํ›„์ง„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋†“์ณค๋‹ค. ์ฒ˜์Œ์— ๊ตฌํ˜„ํ•  ๋•Œ ๋’ค๊ฐ€ ๋ฒฝ์ด๊ฑฐ๋‚˜ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์ด๋ฉด ํ›„์ง„ ๋ชปํ•˜๊ฒŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ๋œ ๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด๋‹ค.

 

 


์ƒ๊ฐ๐Ÿค”