๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/Softeer

[Softeer][level3] ์•ˆ์ „์šด์ „์„ ๋„์™€์ค„ ์ฐจ์„ธ๋Œ€ ์ง€๋Šฅํ˜• ๊ตํ†ต์‹œ์Šคํ…œ (python)

728x90
๋ฐ˜์‘ํ˜•

https://softeer.ai/practice/info.do?idx=1&eid=580 

 

Softeer

์—ฐ์Šต๋ฌธ์ œ๋ฅผ ๋‹ด์„ Set์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”. ์ทจ์†Œ ํ™•์ธ

softeer.ai

 

๋ฌธ์ œ

 

ํ’€์ด

BFS๋ฌธ์ œ.

์‚ฌ์ „์— ์ •์˜๋œ ๊ต์ฐจ๋กœ ์ •๋ณด ์ €์žฅํ•˜๊ณ  ํ•˜๋‚˜์”ฉ ๋ฐฉ๋ฌธํ•ด์„œ ๊ฐฏ์ˆ˜ count

 

์ฒ˜์Œ์— 20์ ์ด ๋‚˜์˜ค๋Š”๋ฐ ํ‹€๋ฆฐ ๋ถ€๋ถ„์„ ์ฐพ๋А๋ผ ์˜ค๋ž˜ ๊ฑธ๋ฆผ. ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์ด์–ด๋„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•ด๋„ ๊ดœ์ฐฎ์•˜์Œ

import sys
from collections import deque
from pprint import pprint

N, T = map(int, input().split())

intersection = [[0] + [] for i in range(N + 1)]
for i in range(1, N + 1) :
    for j in range(1, N + 1) :
        intersection[i].append(list(map(int, input().split())))

visited = [[0] * (N + 1) for _ in range(N + 1)]

go = [[0, 1], [0, -1], [1, 0], [-1, 0]]   # ๋™,์„œ,๋‚จ,๋ถ
heading = {                                 # ๊ฐ ๊ต์ฐจ๋กœ์—์„œ ์ด์ „ ์ง„ํ–‰ ๋ฐฉํ–ฅ
    1:go[0], 2:go[3], 3:go[1], 4:go[2], 
    5:go[0], 6:go[3], 7:go[1], 8:go[2],
    9:go[0], 10:go[3], 11:go[1], 12:go[2]
}
signals = {                                 # ์‹ ํ˜ธ ์ •๋ณด
    1:[3,0,2], 2:[1,3,0], 3:[3,1,2], 4:[1,2,0], 
    5:[3,0], 6:[1,3], 7:[1,2], 8:[2,0],
    9:[0,2], 10:[3,0], 11:[3,1], 12:[1,2]
}

def BFS(start) :

    queue = deque()
    queue.append([start, go[3], 0])  # [ํ˜„์žฌ ๊ต์ฐจ๋กœ, ์ด์ „์— heading๋ฐฉํ–ฅ, ์‹œ๊ฐ„]

    while queue :
        now, prev, t = queue.popleft()
        visited[now[0]][now[1]] = 1
        signal = intersection[now[0]][now[1]][t % 4]

        if prev != heading[signal] :    # ์ง„์ž… ๋ฐฉํ–ฅ๊ณผ ๊ต์ฐจ๋กœ ์ง„ํ–‰ ๋ฐฉํ–ฅ์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ
            continue
        move = signals[signal]          # ์ž…๋ ฅ๋ฐ›์€ ๊ต์ฐจ๋กœ์˜ ์‹ ํ˜ธ
        for m in move :                 # ๊ฐ ์‹ ํ˜ธ์˜ ๊ฒฝ์šฐ
            nx = now[0] + go[m][0]  
            ny = now[1] + go[m][1]
            if nx < 1 or nx > N or ny < 1 or ny > N : # ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
                continue
            if not visited[nx][ny] and t+1 <= T :  # ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ด๋™ ๊ฒฝ๋กœ ์ˆ˜๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
                queue.append([[nx,ny], go[m], t + 1])

    tmp = 0
    for i in range(len(visited)) :
        tmp += visited[i].count(1)
        
    return tmp

print(BFS([1,1]))

 

์ฝ”๋“œ

import sys
from collections import deque
from pprint import pprint

N, T = map(int, input().split())

intersection = [[0] + [] for i in range(N + 1)]
for i in range(1, N + 1) :
    for j in range(1, N + 1) :
        intersection[i].append(list(map(int, input().split())))

visited = [[0] * (N + 1) for _ in range(N + 1)]

go = [[0, 1], [0, -1], [1, 0], [-1, 0]]   # ๋™,์„œ,๋‚จ,๋ถ
heading = {                                 # ๊ฐ ๊ต์ฐจ๋กœ์—์„œ ์ด์ „ ์ง„ํ–‰ ๋ฐฉํ–ฅ
    1:go[0], 2:go[3], 3:go[1], 4:go[2], 
    5:go[0], 6:go[3], 7:go[1], 8:go[2],
    9:go[0], 10:go[3], 11:go[1], 12:go[2]
}
signals = {                                 # ์‹ ํ˜ธ ์ •๋ณด
    1:[3,0,2], 2:[1,3,0], 3:[3,1,2], 4:[1,2,0], 
    5:[3,0], 6:[1,3], 7:[1,2], 8:[2,0],
    9:[0,2], 10:[3,0], 11:[3,1], 12:[1,2]
}

def BFS(start) :

    queue = deque()
    queue.append([start, go[3], 0])  # [ํ˜„์žฌ ๊ต์ฐจ๋กœ, ์ด์ „์— heading๋ฐฉํ–ฅ, ์‹œ๊ฐ„]

    while queue :
        now, prev, t = queue.popleft()
        visited[now[0]][now[1]] = 1
        signal = intersection[now[0]][now[1]][t % 4]

        if prev != heading[signal] :    # ์ง„์ž… ๋ฐฉํ–ฅ๊ณผ ๊ต์ฐจ๋กœ ์ง„ํ–‰ ๋ฐฉํ–ฅ์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ
            continue
        move = signals[signal]          # ์ž…๋ ฅ๋ฐ›์€ ๊ต์ฐจ๋กœ์˜ ์‹ ํ˜ธ
        for m in move :                 # ๊ฐ ์‹ ํ˜ธ์˜ ๊ฒฝ์šฐ
            nx = now[0] + go[m][0]  
            ny = now[1] + go[m][1]
            if nx < 1 or nx > N or ny < 1 or ny > N : # ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
                continue
            if t < T :  # ์ด๋™ ๊ฒฝ๋กœ ์ˆ˜๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
                queue.append([[nx,ny], go[m], t + 1])

    tmp = 0
    for i in range(len(visited)) :
        tmp += visited[i].count(1)
        
    return tmp

print(BFS([1,1]))
728x90
๋ฐ˜์‘ํ˜•