์•Œ๊ณ ๋ฆฌ์ฆ˜/๊ทธ๋ž˜ํ”„

[๋ฐฑ์ค€ 14466 ๐Ÿฅ‡] ์†Œ๊ฐ€ ๊ธธ์„ ๊ฑด๋„ˆ๊ฐ„ ์ด์œ 6

1eehyunji 2023. 7. 11. 01:37

๋ฌธ์ œ

์†Œ๊ฐ€ ๊ธธ์„ ๊ฑด๋„ˆ๊ฐ„ ์ด์œ ๋Š” ๊ทธ๋ƒฅ ๊ธธ์ด ๋งŽ์•„์„œ์ด๋‹ค. ์กด์˜ ๋†์žฅ์—๋Š” ๊ธธ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ, ๊ธธ์„ ๊ฑด๋„ˆ์ง€ ์•Š๊ณ ์„œ๋Š” ๋ณ„๋กœ ๋Œ์•„๋‹ค๋‹ ์ˆ˜๊ฐ€ ์—†๋‹ค.

์กด์˜ ๋†์žฅ์— ๋Œ€๋Œ€์ ์ธ ๊ฐœํŽธ์ด ์žˆ์—ˆ๋‹ค. ์ด์ œ ์ž‘์€ ์ •์‚ฌ๊ฐํ˜• ๋ชฉ์ดˆ์ง€๊ฐ€ N×N (2 ≤ N ≤ 100) ๊ฒฉ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ธ์ ‘ํ•œ ๋ชฉ์ดˆ์ง€ ์‚ฌ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ๊ฑด๋„ˆ๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ๊ธธ์„ ๊ฑด๋„ˆ์•ผ ํ•œ๋‹ค. ๋†์žฅ์˜ ๋ฐ”๊นฅ์—๋Š” ๋†’์€ ์šธํƒ€๋ฆฌ๊ฐ€ ์žˆ์–ด์„œ ์†Œ๊ฐ€ ๋†์žฅ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐˆ ์ผ์€ ์—†๋‹ค.

K๋งˆ๋ฆฌ์˜ (1 ≤ K ≤ 100,K ≤ N2) ์†Œ๊ฐ€ ์กด์˜ ๋†์žฅ์— ์žˆ๊ณ , ๊ฐ ์†Œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ชฉ์ดˆ์ง€์— ์žˆ๋‹ค. ์–ด๋–ค ๋‘ ์†Œ๋Š” ๊ธธ์„ ๊ฑด๋„ˆ์ง€ ์•Š์œผ๋ฉด ๋งŒ๋‚˜์ง€ ๋ชป ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์†Œ๊ฐ€ ๋ช‡ ์Œ์ธ์ง€ ์„ธ์–ด๋ณด์ž.

์ž…๋ ฅ

์ฒซ ์ค„์— N, K, R์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ R์ค„์—๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ๊ธธ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ธธ์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋‘ ๋ชฉ์ดˆ์ง€๋ฅผ ์ž‡๊ณ , r c r′ c′์˜ ํ˜•ํƒœ (ํ–‰, ์—ด, ํ–‰, ์—ด)๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ˆ˜๋Š” 1 ์ด์ƒ N ์ดํ•˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ K์ค„์—๋Š” ํ•œ ์ค„์˜ ํ•˜๋‚˜์”ฉ ์†Œ์˜ ์œ„์น˜๊ฐ€ ํ–‰๊ณผ ์—ด๋กœ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

๊ธธ์„ ๊ฑด๋„ˆ์ง€ ์•Š์œผ๋ฉด ๋งŒ๋‚  ์ˆ˜ ์—†๋Š” ์†Œ๊ฐ€ ๋ช‡ ์Œ์ธ์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋ฌธ์ œํ’€์ด

import sys
from collections import deque

n,k,r=map(int, sys.stdin.readline().split(' '))

# dummy
graph=[[0]*(n+1) for _ in range(n+1)]
# 3์ฐจ์› ๋ฐฐ์—ด
ways=[[[] for _ in range(n+1)] for _ in range(n+1)]
for i in range(1,r+1):
    r,c,r_,c_=map(int, sys.stdin.readline().split(' '))
    ways[r][c].append((r_, c_))
    ways[r_][c_].append((r,c))

cow=[]
for _ in range(k):
    y,x=map(int, sys.stdin.readline().split(' '))
    cow.append((y,x))


def impossible_meet_cow(sy, sx, ey, ex):
    global ways
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    queue=deque()
    queue.append((sy,sx))
    visited=[[0]*(n+1) for _ in range(n+1)]
    visited[sy][sx]=1
    while queue:
        cury, curx=queue.popleft()
        if cury==ey and curx==ex:
            return False
        for di in directions:
            dy=cury+di[0]
            dx=curx+di[1]
            if 1<=dy<=n and 1<=dx<=n and visited[dy][dx]==0:
                # (dy,dx)๊ฐ€ ways[cury][curx]์— ์กด์žฌํ•˜๋Š”์ง€ ์ฆ‰, ๊ธธ์„ ๊ฑด๋„ˆ์•ผ๋งŒ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ธ์ง€ ํ™•์ธ
                if (dy,dx) not in ways[cury][curx]:
                    queue.append((dy,dx))
                    visited[dy][dx]=1
    else:
        return True

ans=0
for i in range(k):
    for j in range(i,k):
        # start cow
        sc_y, sc_x=cow[i]
        # end cow
        ec_y, ec_x=cow[j]
        if impossible_meet_cow(sc_y, sc_x, ec_y,ec_x):
            ans+=1

print(ans)

3์ฐจ์› ๋ฐฐ์—ด ways[][][]์— ๊ฐ ์œ„์น˜์—์„œ ๊ฐˆ ์ˆ˜ ์—†๋Š” ์œ„์น˜๋ฅผ ํŠœํ”Œ ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  cow ๋ฐฐ์—ด์— ์†Œ๋“ค์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

2์ค‘ for๋ฌธ์„ ์ด์šฉํ•ด์„œ ์†Œ๋“ค์˜ ์œ„์น˜ 2๊ฐœ๋ฅผ ์„ ํƒํ•ด์ฃผ๋Š”๋ฐ, ์ด๋•Œ ์ค‘๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฒซ๋ฒˆ์งธ ์„ ํƒ๋œ ์œ„์น˜๋ณด๋‹ค ์ธ๋ฑ์Šค๊ฐ€ ํฐ ์œ„์น˜๋ฅผ ์„ ํƒํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์„ ํƒ๋œ ์ถœ๋ฐœ ์†Œ์˜ ์œ„์น˜์™€ ๋„์ฐฉ ์†Œ์˜ ์œ„์น˜๋ฅผ impossible_meet_cow ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๊ธธ์„ ๊ฑด๋„ˆ์ง€ ์•Š๊ณ ๋Š” ๋„์ฐฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.

 

impossible_meet_cow ํ•จ์ˆ˜์—์„œ๋Š” bfs ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ , wheile...else...๋ฌธ์„ ์ด์šฉํ•œ๋‹ค. 

์—ฌ๊ธฐ์„œ, ํƒ์ƒ‰ํ•˜๋Š” ํ์— ์œ„์น˜๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ์กฐ๊ฑด์€ ๊ฒฉ์žํŒ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์œผ๋ฉด์„œ, ๋ฐฉ๋ฌธํ•œ ์  ์—†๊ณ , ํ˜„์žฌ ์œ„์น˜์—์„œ ๋„๋‹ฌ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ฉด ๋„ฃ์–ด์ค€๋‹ค.

while๋ฌธ ์•ˆ์—์„œ ๋„์ฐฉ ์œ„์น˜์— ๋„๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋ฉด False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด else๋ฌธ์œผ๋กœ ๋“ค์–ด๊ฐ€ True๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.