Programming/Algorithm(Python)

[백준/python][구현] 8972번 - 미친 아두이노

code_wizard 2025. 5. 21. 20:58

오늘은 선 피드백(아직도 2차원 BFS에서 실수가 나오다니요!!😤)

1. command의 for com in command:를 할 때, c로 변수를 주면 (r,c)로 row,column 으로 받을 때 변수명 겹침

2. 한 방에 지워야하는 폭탄 같은 문제에서 각자 단일 처리하면 안됨, 끝나고 한 번에 처리해야함 (문제 핵심 부분 파악하기)

3. 2차원 한방에 제거 (아직도 어리버리) crazys = [[i,j] for i, j in crazys if [i,j] not in delete or 0]

 

 

 

정답

from sys import stdin
move = [(0,0),(1,-1),(1,0),(1,1),(0,-1),(0,0),(0,1),(-1,-1),(-1,0),(-1,1)]
r_line = stdin.readline
INF = float('inf')

r, c = map(int, r_line().split())
mat = [0]*r
for i in range(r):
    mat[i] = list(r_line().rstrip())
command = list(map(int, r_line().rstrip()))

# 1) 아두이노 위치 찾기
crazys = []
x = y = 0
for i in range(r):
    for j in range(c):
        if mat[i][j] == 'R':
            crazys.append([i,j])
        elif mat[i][j] == 'I':
            x,y = i,j

# 2) 움직이기
cnt = 0
flag = 0
for com in command:
    cnt += 1
    # 1) 종수 이동
    if com != 5:
        px = x + move[com][0]
        py = y + move[com][1]
        if 0<=px<r and 0<=py<c:

            if mat[px][py] == 'R': # 미친 아두이노 만나면, 게임종료
                flag = 1
                break
            else:
                mat[px][py] = 'I'
                mat[x][y] = '.' 
                x,y = px,py # 좌표 업데이트

    # 2) 미친 아두이노 이동
    die = 0
    move_i = [] # 이동한 아두이노들 
    c_mat = [[0]*c for _ in range(r)] # 갯수를 체크하는 맵

    for i in range(len(crazys)):
        r2,s2 = crazys[i][0],crazys[i][1]
        
        # 1) 가장 가까워 지는 방향 구하기
        min_v = [0, INF] # 번호, 값
        for idx, (dx, dy) in enumerate(move):
            if 0<=(r2+dx)<r and 0<=(s2+dy)<c:
                value = abs(x-(r2+dx)) + abs(y-(s2+dy))
                if value < min_v[1]:
                    min_v = [idx, value]    

        # 2) 미친 아두이노 이동
        px = r2 + move[min_v[0]][0]
        py = s2 + move[min_v[0]][1]
        if mat[px][py] == 'I': # 종수 만나면, 게임종료
            die = 1
            break
        else:
            mat[px][py] = 'R'
            c_mat[px][py] += 1 # 갯수 증가
            if c_mat[r2][s2] == 0: # 원래 구역 자리에 아무도 없다면
                mat[r2][s2] = '.' # 원래 구역 제거
            crazys[i][0],crazys[i][1] = px, py
    
    if die == 1:
        flag = 1
        break 
    
    # 폭발 아두이노 제거
    delete = []
    for i in range(r):
        for j in range(c):
            if c_mat[i][j] > 1:
                mat[i][j] = '.'
                delete.append([i,j])
    crazys = [[i,j] for i, j in crazys if [i,j] not in delete or 0]
    
if flag == 1:
    print("kraj " + str(cnt))
else:
    for i in range(r):
        print(''.join(mat[i]))

링크: https://www.acmicpc.net/problem/8972