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

[๋ฐฑ์ค€] 9205 ๋งฅ์ฃผ ๋งˆ์‹œ๋ฉด์„œ ๊ฑธ์–ด๊ฐ€๊ธฐ (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2023. 4. 9. 20:40

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

 

9205๋ฒˆ: ๋งฅ์ฃผ ๋งˆ์‹œ๋ฉด์„œ ๊ฑธ์–ด๊ฐ€๊ธฐ

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

www.acmicpc.net


๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ์ธ ์ค„ ๋ชจ๋ฅด๊ณ  ์‚ฝ์งˆํ–ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ์–ด๋ณด์ž.


์•„์ด๋””์–ด

1. ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

  • ์‹ฌํ”Œํ•˜๊ฒŒ ๋งฅ์ฃผ 20๋ณ‘ = 1000m๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  1000m๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.
  • bfs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

from collections import deque

def cal_distance(x, y, nx, ny):
    return abs(nx - x) + abs(ny - y)


def bfs():
    if cal_distance(home_x, home_y, rock_x, rock_y) <= 1000:
        visited[n] = True
        return

    que = deque()

    for i in range(len(conveni)):
        temp = cal_distance(home_x, home_y, conveni[i][0], conveni[i][1])
        if temp <= 1000:
            que.append(conveni[i])
            visited[i] = True

    while que:
        cx, cy = que.popleft()
        for i in range(len(conveni)):
            temp = cal_distance(cx, cy, conveni[i][0], conveni[i][1])
            if temp <= 1000 and not visited[i]:
                que.append(conveni[i])
                visited[i] = True

t = int(input())

for _ in range(t):
    n = int(input())
    visited = [False] * (n + 1)
    conveni = []

    home_x, home_y = map(int, input().split())

    for _ in range(n):
        conveni.append([int(a) for a in input().split()])

    rock_x, rock_y = map(int, input().split())
    conveni.append([rock_x, rock_y])

    bfs()

    if visited[n] == True:
        print('happy')
    else:
        print('sad')

์ฝ”๋“œ ์„ค๋ช…

1. ๋ฉ”์ธ

t = int(input())

for _ in range(t):
    n = int(input())
    visited = [False] * (n + 1)
    conveni = []

    home_x, home_y = map(int, input().split())

    for _ in range(n):
        conveni.append([int(a) for a in input().split()])

    rock_x, rock_y = map(int, input().split())
    conveni.append([rock_x, rock_y])

    bfs()

    if visited[n] == True:
        print('happy')
    else:
        print('sad')

์ž…๋ ฅ๋ฐ›์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ฐœ์ˆ˜ t๊ฐœ๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ž…๋ ฅ๋ฐ›์€ ํŽ˜์Šคํ‹ฐ๋ฒŒ ์ขŒํ‘œ๋Š” ํŽธ์˜์  ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

conveni[n]์€ ํŽ˜์Šคํ‹ฐ๋ฒŒ์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰(bfs)์„ ํ•˜๊ณ  visited[n] = True์ด๋ฉด ํŽ˜์Šคํ‹ฐ๋ฒŒ์— ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ 

'happy'๋ฅผ ์ถœ๋ ฅํ•ด ์ค€๋‹ค. False๋ฉด 'sad'๋ฅผ ์ถœ๋ ฅํ•ด ์ค€๋‹ค.

 

2. bfs

def bfs():
    if cal_distance(home_x, home_y, rock_x, rock_y) <= 1000:
        visited[n] = True
        return

    que = deque()

    for i in range(len(conveni)):
        temp = cal_distance(home_x, home_y, conveni[i][0], conveni[i][1])
        if temp <= 1000:
            que.append(conveni[i])
            visited[i] = True

    while que:
        cx, cy = que.popleft()
        for i in range(len(conveni)):
            temp = cal_distance(cx, cy, conveni[i][0], conveni[i][1])
            if temp <= 1000 and not visited[i]:
                que.append(conveni[i])
                visited[i] = True

๋จผ์ €, ์ง‘์—์„œ ๋ฐ”๋กœ ํŽ˜์Šคํ‹ฐ๋ฒŒ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด ํƒ์ƒ‰ ์—†์ด ๋ฐ”๋กœ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

 

ํƒ์ƒ‰์ „์— ์ง‘์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํŽธ์˜์ ์„ ์ „๋ถ€ ํ์— ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

 

์ž…๋ ฅ๋ฐ›์€ ํŽธ์˜์  ์ขŒํ‘œ๋“ค์€ while๋ฌธ์—์„œ ํ•˜๋‚˜์”ฉ pop์„ ํ•˜๋ฉฐ ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•ด ๋‚˜๊ฐ„๋‹ค.

๋ฐฉ๋ฌธํ•˜๋ฉด visited = True๋กœ ๋ณ€๊ฒฝํ•ด ์ค€๋‹ค.

 

 

3. calculate distance(๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ)

def cal_distance(x, y, nx, ny):
    return abs(nx - x) + abs(ny - y)

๊ฐ„๋‹จํžˆ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค. x, y ๊ฑฐ๋ฆฌ์ฐจ๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.