[ BOJ / Python ] 8972번 미친 아두이노

황승환·2022년 5월 30일
0

Python

목록 보기
316/498


이번 문제는 시뮬레이션 문제로, 주어진 이동 방향 순서대로 종수를 이동시키고, 미친 아두이노의 움직이는 방향을 종수와의 거리가 가장 가까운 좌표로 이동시키며 결과를 확인하는 문제였다. 시뮬레이션 문제였기에 종수의 움직임과 미친 아두이노의 움직임을 함수로 나눠 구현하였다.

Code

from collections import defaultdict
r, c=map(int, input().split())
grid=[list(str(input())) for _ in range(r)]
user=[]
mad=[]
for i in range(r):
    for j in range(c):
        if grid[i][j]=='I':
            user=(i, j)
        if grid[i][j]=='R':
            mad.append((i, j))
coms=str(input())
dy, dx=[0, 1, 1, 1, 0, 0, 0, -1, -1, -1], [0, -1, 0, 1, -1, 0, 1, -1, 0, 1]
def move_I(num):
    global user
    user=(user[0]+dy[int(coms[num])], user[1]+dx[int(coms[num])])
    if 0<=user[0]<r and 0<=user[1]<c:
        if (user[0], user[1]) in set(mad):
            print("kraj {0}".format(num+1))
            quit()
def move_R(num):
    global mad
    counting=defaultdict(int)
    for i in range(len(mad)):
        y, x=mad[i][0], mad[i][1]
        tmp=1e9
        d=-1
        for j in range(1, 10):
            ny, nx=y+dy[j], x+dx[j]
            if 0<=ny<r and 0<=nx<c:
                dist=abs(ny-user[0])+abs(nx-user[1])
                if dist<tmp:
                    tmp=dist
                    d=j
        mad[i]=(mad[i][0]+dy[d], mad[i][1]+dx[d])
        counting[mad[i]]+=1
        if mad[i]==user:
            print("kraj {0}".format(num+1))
            quit()
    new_mad=[]
    for i in range(len(mad)):
        if counting[mad[i]]>1:
            continue
        else:
            new_mad.append(mad[i])
    mad=new_mad[:]
for i in range(len(coms)):
    move_I(i)
    move_R(i)
answer=[['.' for _ in range(c)] for _ in range(r)]
answer[user[0]][user[1]]='I'
for y, x in mad:
    if y==-1 and x==-1:
        continue
    answer[y][x]='R'
for i in range(r):
    print(''.join(answer[i]))

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글