๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 21610_๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ

๋ฟŒ์•ผ._. 2022. 5. 16. 14:47

Gold V

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

<๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ>

๋ฌธ์ œ 

 

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ํŒŒ์ด์–ด๋ณผ, ํ† ๋„ค์ด๋„, ํŒŒ์ด์–ด์Šคํ†ฐ, ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜ ์ƒˆ๋กœ ๋ฐฐ์šด ๋งˆ๋ฒ•์€ ๋น„๋ฐ”๋ผ๊ธฐ์ด๋‹ค. ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ์‹œ์ „ ํ•˜๋ฉด ํ•˜๋Š˜์— ๋น„๊ตฌ๋ฆ„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋Š˜์€ ๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ฒฉ์ž์—์„œ ์—ฐ์Šตํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ฒฉ์ž์˜ ๊ฐ ์นธ์—๋Š” ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ํ•˜๋‚˜ ์žˆ๊ณ , ๋ฐ”๊ตฌ๋‹ˆ๋Š” ์นธ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค. ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌผ์˜ ์–‘์—๋Š” ์ œํ•œ์ด ์—†๋‹ค. (r, c)๋Š” ๊ฒฉ์ž์˜ rํ–‰ c์—ด์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ์˜๋ฏธํ•˜๊ณ , A [r][c]๋Š” (r, c)์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฌผ์˜ ์–‘์„ ์˜๋ฏธํ•œ๋‹ค.

๊ฒฉ์ž์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์œ— ์นธ์€ (1, 1)์ด๊ณ , ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋žซ ์นธ์€ (N, N)์ด๋‹ค. ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๋Š” ์—ฐ์Šต์„ ์œ„ํ•ด 1๋ฒˆ ํ–‰๊ณผ N๋ฒˆ ํ–‰์„ ์—ฐ๊ฒฐํ–ˆ๊ณ , 1๋ฒˆ ์—ด๊ณผ N๋ฒˆ ์—ด๋„ ์—ฐ๊ฒฐํ–ˆ๋‹ค. ์ฆ‰, N๋ฒˆ ํ–‰์˜ ์•„๋ž˜์—๋Š” 1๋ฒˆ ํ–‰์ด, 1๋ฒˆ ํ–‰์˜ ์œ„์—๋Š” N๋ฒˆ ํ–‰์ด ์žˆ๊ณ , 1๋ฒˆ ์—ด์˜ ์™ผ์ชฝ์—๋Š” N๋ฒˆ ์—ด์ด, N๋ฒˆ ์—ด์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” 1๋ฒˆ ์—ด์ด ์žˆ๋‹ค.

๋น„๋ฐ”๋ผ๊ธฐ๋ฅผ ์‹œ์ „ ํ•˜๋ฉด (N, 1), (N, 2), (N-1, 1), (N-1, 2)์— ๋น„๊ตฌ๋ฆ„์ด ์ƒ๊ธด๋‹ค. ๊ตฌ๋ฆ„์€ ์นธ ์ „์ฒด๋ฅผ ์ฐจ์ง€ํ•œ๋‹ค. ์ด์ œ ๊ตฌ๋ฆ„์— ์ด๋™์„ M๋ฒˆ ๋ช…๋ นํ•˜๋ ค๊ณ  ํ•œ๋‹ค. i๋ฒˆ์งธ ์ด๋™ ๋ช…๋ น์€ ๋ฐฉํ–ฅ di๊ณผ ๊ฑฐ๋ฆฌ si๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋ฐฉํ–ฅ์€ ์ด 8๊ฐœ์˜ ๋ฐฉํ–ฅ์ด ์žˆ์œผ๋ฉฐ, 8๊ฐœ์˜ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•œ๋‹ค. 1๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ←, โ†–, ↑, โ†—, →, โ†˜, ↓, โ†™์ด๋‹ค. ์ด๋™์„ ๋ช…๋ นํ•˜๋ฉด ๋‹ค์Œ์ด ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค.

1. ๋ชจ๋“  ๊ตฌ๋ฆ„์ด di ๋ฐฉํ–ฅ์œผ๋กœ si์นธ ์ด๋™ํ•œ๋‹ค.
2. ๊ฐ ๊ตฌ๋ฆ„์—์„œ ๋น„๊ฐ€ ๋‚ด๋ ค ๊ตฌ๋ฆ„์ด ์žˆ๋Š” ์นธ์˜ ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 1 ์ฆ๊ฐ€ํ•œ๋‹ค.
3. ๊ตฌ๋ฆ„์ด ๋ชจ๋‘ ์‚ฌ๋ผ์ง„๋‹ค.
4. 2์—์„œ ๋ฌผ์ด ์ฆ๊ฐ€ํ•œ ์นธ (r, c)์— ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‹œ์ „ ํ•œ๋‹ค. ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ์นธ์— ๋ฌผ์ด ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ์ˆ˜๋งŒํผ (r, c)์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ๋ฌผ์ด ์–‘์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
     ์ด๋•Œ๋Š” ์ด๋™๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ์นธ์€ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ์นธ์ด ์•„๋‹ˆ๋‹ค.
     ์˜ˆ๋ฅผ ๋“ค์–ด, (N, 2)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, 1), (N-1, 3)์ด๊ณ , (N, N)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, N-1)๋ฟ์ด๋‹ค.
5. ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 2 ์ด์ƒ์ธ ๋ชจ๋“  ์นธ์— ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๊ณ , ๋ฌผ์˜ ์–‘์ด 2 ์ค„์–ด๋“ ๋‹ค. ์ด๋•Œ ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๋Š” ์นธ์€ 3์—์„œ ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง„ ์นธ์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.

M๋ฒˆ์˜ ์ด๋™์ด ๋ชจ๋‘ ๋๋‚œ ํ›„ ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์˜ ์–‘์˜ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž.

 

 

์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— N, M์ด ์ฃผ์–ด์ง„๋‹ค.
๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. r๋ฒˆ์งธ ํ–‰์˜ c๋ฒˆ์งธ ์ •์ˆ˜๋Š” A [r][c]๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ์ด๋™์˜ ์ •๋ณด di, si๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค.

 

์ถœ๋ ฅ 

 

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

 

 

๋ฌธ์ œ ํ’€์ด

 

 - my solution (Python)

 

import sys

n,m=map(int,sys.stdin.readline().split())
arr=[] # ๋ฐ”๊ตฌ๋‹ˆ
cloud=[[0]*n for i in range(n)] # ๊ตฌ๋ฆ„
for i in range(n):
    arr.append(list(map(int,sys.stdin.readline().split())))

info=[] # ์ด๋™์˜ ์ •๋ณด
for i in range(m):
    info.append(list(map(int,sys.stdin.readline().split())))

# ์ฒ˜์Œ ๋น„๊ตฌ๋ฆ„ ์œ„์น˜
cloud[n-1][0]=1
cloud[n-1][1]=1
cloud[n-2][0]=1
cloud[n-2][1]=1

# 8๊ฐœ์˜ ๋ฐฉํ–ฅ
dx=[0,-1,-1,-1,0,1,1,1]
dy=[-1,-1,0,1,1,1,0,-1]

# ๋Œ€๊ฐ์„ 
dia_x=[-1,-1,1,1]
dia_y=[-1,1,-1,1]

for i in info:
    visited = [[0] * n for v in range(n)]
    for j in range(n):
        for k in range(n):
            if cloud[j][k]==1: # ๋น„๊ตฌ๋ฆ„์ด ์žˆ๋‹ค๋ฉด ์ด๋™
                x=j+(dx[i[0]-1]*i[1])
                y=k+(dy[i[0]-1]*i[1])
                if x<0:
                    x=n-(-x)%n
                    if x==n:
                        x=0
                elif x>=n:
                    x%=n
                if y<0:
                    y = n - (-y) % n
                    if y==n:
                        y=0
                elif y>=n:
                    y%=n
                visited[x][y]=1 
                arr[x][y]+=1 # ๋น„๊ฐ€ ๋‚ด๋ ค ๊ตฌ๋ฆ„ ์žˆ๋Š” ์นธ์˜ ๋ฌผ์˜ ์–‘ +1
                cloud[j][k]=0 # ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง
    for j in range(n): # ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ
        for k in range(n):
            if visited[j][k]==1: # ๋ฌผ์ด ์ฆ๊ฐ€ํ•œ ์นธ
                cnt=0
                for v in range(4): # ๋Œ€๊ฐ์„ 
                    x=j+dia_x[v]
                    y=k+dia_y[v]
                    if 0<=x<n and 0<=y<n:
                        if arr[x][y]!=0:
                            cnt+=1
                arr[j][k]+=cnt # ๋ฌผ์˜ ์–‘ ์ฆ๊ฐ€
    for j in range(n):
        for k in range(n):
            if arr[j][k]>=2 and visited[j][k]==0: # ๋ฌผ์˜ ์–‘ 2 ์ด์ƒ, ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง„ ์นธ x
                cloud[j][k]=1 # ๊ตฌ๋ฆ„ ์ƒ๊น€
                arr[j][k]-=2 # ๋ฌผ์˜ ์–‘ -2

result=0 # ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์˜ ์–‘์˜ ํ•ฉ
for i in range(n):
    for j in range(n):
        result+=arr[i][j]

print(result)

 

  • n, m 
  • arr = N x N ๊ฒฉ์ž ์ž…๋ ฅ ์ €์žฅ
    info = ์ด๋™์˜ ์ •๋ณด ์ž…๋ ฅ ์ €์žฅ
  • cloud = ๊ตฌ๋ฆ„ ์œ„์น˜ ์ •๋ณด 
    # ์ฒ˜์Œ ๋น„๊ตฌ๋ฆ„์˜ ์œ„์น˜ (n-1,0) (n-1,1) (n-2,0) (n-2,1)
  • dx, dy = 8 ๊ฐœ์˜ ๋ฐฉํ–ฅ
    dia_x, dia_y = ๋Œ€๊ฐ์„ 
  • ์ด๋™์˜ ์ •๋ณด ๋ฆฌ์ŠคํŠธ ์ˆœํ™˜ 
    - visited = ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง„ ์นธ ํŒ๋ณ„ ๋ฐ ๋ฌผ์ด ์ฆ๊ฐ€ํ•œ ์นธ ํŒ๋ณ„

    # ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ˆœ์„œ 3๋ฒˆ๊นŒ์ง€ ํ•ด๊ฒฐ
    - arr ์ „์ฒด ์ˆœํ™˜ํ•˜๋ฉฐ ๋น„๊ตฌ๋ฆ„์ด ์žˆ๋‹ค๋ฉด di ๋ฐฉํ–ฅ์œผ๋กœ si ์นธ ์ด๋™ ( 1๋ฒˆ ํ–‰๊ณผ N๋ฒˆ ํ–‰, 1๋ฒˆ ์—ด๊ณผ N๋ฒˆ ์—ด์„ ์—ฐ๊ฒฐํ–ˆ์œผ๋ฏ€๋กœ index๋ฅผ ์ž˜ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ) -> ์ด๋™ํ•œ ์นธ visited 1๋กœ ์ €์žฅ ๋ฐ ๋น„๊ฐ€ ๋‚ด๋ฆฌ๋ฏ€๋กœ ๊ตฌ๋ฆ„์ด ์žˆ๋Š” ์นธ์˜ ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘ +1, ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง€๋ฏ€๋กœ cloud 0์œผ๋กœ ์ €์žฅ

    # ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ˆœ์„œ 4๋ฒˆ ํ•ด๊ฒฐ
    - ๋ฌผ๋ณต์‚ฌ ๋ฒ„๊ทธ๋ฅผ ์œ„ํ•ด arr ์ „์ฒด ์ˆœํ™˜ํ•˜์—ฌ ๋ฌผ์ด ์ฆ๊ฐ€ํ•œ ์นธ์ด๋ผ๋ฉด ( visited ๊ฐ’์ด 1์ด๋ผ๋ฉด ) ๊ทธ ์ขŒํ‘œ์—์„œ ๋Œ€๊ฐ์„ ์„ ๊ตฌํ•˜์—ฌ ๊ทธ arr ๊ฐ’์ด 0์ด ์•„๋‹ˆ๋ผ๋ฉด cnt +1 -> ๋Œ€๊ฐ์„  4๊ณณ์„ ํŒ๋ณ„ํ•œ ํ›„ arr (๋ฐ”๊ตฌ๋‹ˆ)์— ๋ฌผ์˜ ์–‘ ์ฆ๊ฐ€ํ•ด์คŒ (+cnt)

    # ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ˆœ์„œ 5๋ฒˆ ํ•ด๊ฒฐ
    -  arr ์ „์ฒด๋ฅผ ์ˆœํ™˜ํ•˜์—ฌ ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์ด 2 ์ด์ƒ์ด๊ณ  ์ˆœ์„œ 3์—์„œ ๊ตฌ๋ฆ„์ด ์‚ฌ๋ผ์ง„ ์นธ์ด ์•„๋‹ˆ๋ผ๋ฉด ( visited ๊ฐ’์ด 0์ด๋ผ๋ฉด) ๊ตฌ๋ฆ„์ด ์ƒ๊ธฐ๊ณ  ๋ฌผ์˜ ์–‘์ด 2 ์ค„์–ด๋“ฆ
  • result = ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์˜ ์–‘์˜ ํ•ฉ
    - arr ์ „์ฒด๋ฅผ ์ˆœํ™”ํ•˜์—ฌ ๋ชจ๋“  ๊ฐ’์„ ๋‹ค ๋”ํ•ด์ค€ ํ›„ result ์ถœ๋ ฅ

 

 

โ“ ์™œ ํ‹€๋ ธ๋Š”๊ฐ€?

๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์˜ˆ์‹œ๋งŒ ์ƒ๊ฐํ•ด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€๋‹ค. ์ขŒํ‘œ๋ฅผ ๊ตฌํ•  ๋•Œ ๋ฒ”์œ„๋ฅผ ๋ฌธ์ œ์—์„œ ์ œ์‹œํ•œ ๊ฐ’์œผ๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•˜์—ฌ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ขŒํ‘œ๋ฅผ ๊ตฌํ•  ๋•Œ x, y ๋‘˜ ๋‹ค ์˜ˆ์™ธ ์กฐ๊ฑด์„ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ x์—๋งŒ ์„ค์ •ํ•˜์—ฌ ์ธ๋ฑ์Šค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

 

 

โ“ index ์„ค์ •

1๋ฒˆ ํ–‰๊ณผ N๋ฒˆ ํ–‰์„ ์—ฐ๊ฒฐํ•˜๊ณ , 1๋ฒˆ ์—ด๊ณผ N๋ฒˆ ์—ด์„ ์—ฐ๊ฒฐํ–ˆ์œผ๋ฏ€๋กœ ํ–‰๊ณผ ์—ด์„ ๊ตฌํ•  ๋•Œ ์กฐ๊ฑด์‹์„ ํ†ตํ•˜์—ฌ ์ขŒํ‘œ๋ฅผ ๊ตฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

ํ˜ผ์ž ์ขŒํ‘œ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด์„œ ๊ตฌํ•œ ์‹์ธ๋ฐ... ์•„์ง ๊ธ€๋กœ ์„ค๋ช…ํ•˜๊ธฐ์—๋Š” ํž˜๋“  ๊ฒƒ ๊ฐ™๋‹ค...

๋‹ค์Œ์— ์ •๋ฆฌํ•ด์„œ ๋Œ์•„์˜ค๊ฒ ๋‹ค -!

 


์ƒ๊ฐ๐Ÿค”

 

๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ๊ณ  ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค. 

ํ•˜์ง€๋งŒ... ๋ฐฉ์‹ฌํ•˜์ง€ ๋ง์ž... ํ•˜๋‚˜๋ผ๋„ ๋น ํŠธ๋ฆฌ๋ฉด ์‹คํŒจํ•œ๋‹ค.