python-for-coding-test icon indicating copy to clipboard operation
python-for-coding-test copied to clipboard

Q.48 어른 상어 p.407 질문입니다.

Open epson220 opened this issue 3 years ago • 0 comments

격자의 크기, 상어의 개수, k초 후 사라질 냄새

n , m, k = map(int, input().split())

상어의 위치 배열

array = [] for i in range(n): array.append(list(map(int, input().split())))

상어의 방향 정보

dir = list(map(int, input().split()))

상어들의 우선 순위

priority = [[None]*4 for i in range(m)] for i in range(m): for j in range(4): temp = list(map(int, input().split())) priority[i][j] = temp

smell = [[[0, 0]]*n for _ in range(n)] for i in range(n): for j in range(n): if array[i][j] != 0: smell[i][j][0] = array[i][j] smell[i][j][1] = k

dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1]

위:1, 아래:2, 왼쪽:3, 오른쪽:4

def move():

모든 곳을 순차적으로 확인

for i in range(n): for j in range(n): # 상어가 있는 곳이라면 if array[i][j] != 0: # 현재 상어의 방향 d = dir[array[i][j]-1] # 상 하 좌 우에 냄새가 없는 곳이 있는가? for x in range(4): # 현재 상어의 방향에 따른 우선순위 순서대로 체크 nx = i + dx[priority[array[i][j]-1][d-1][x]-1] ny = j + dy[priority[array[i][j]-1][d-1][x]-1] if 0 <= nx < n and 0 <= ny < n: if smell[nx][ny][1] == 0: # 냄새가 없다면 # 해당 상어의 방향 이동시키기 dir[array[i][j]-1] = priority[array[i][j]-1][d-1][x] # 이동할 곳에 다른 상어가 있는 경우 if array[nx][ny] != 0: array[nx][ny] = min(array[nx][ny], array[i][j]) array[i][j] = 0 # 이동할 곳에 다른 상어가 없는 경우 else: array[nx][ny] = array[i][j] array[i][j] = 0 break continue # 상 하 좌 우 모두 냄새가 있다면? # 자신의 냄새가 있는 곳으로 이동 for x in range(4): # 현재 상어의 방향에 따른 우선순위 순서대로 체크 nx = i + dx[priority[array[i][j]-1][d-1][x]-1] ny = j + dy[priority[array[i][j]-1][d-1][x]-1] if 0 <= nx < 4 and 0 <= ny < 4: # 다음으로 이동할 곳의 냄새가 현재 상어와 같다면 if smell[nx][ny][0] == array[i][j]: dir[array[i][j]-1] = priority[array[i][j]-1][d-1][x] array[nx][ny] = array[i][j] array[i][j] = 0 break

def update_smell(): for i in range(n): for j in range(n): # 상어가 존재하는 곳은 smell을 k로 if array[i][j] != 0: smell[i][j][0] = array[i][j] smell[i][j][1] = k # 냄새가 존재하는 경우 1만큼 감소시키기 if smell[i][j][1] > 0: smell[i][j][1] -= 1

flag = False time = 0 while True: for i in range(n): for j in range(n): if smell[i][j][0] > 1: flag = True if flag == False: print(time) break

if time > 1000: print(-1) print(array) break

move() update_smell() time += 1 if time == 1: print(array) print(smell)

제 코드를 실행해보면 교재의 테스트케이스 입력 후 time이 1000이 넘겨서 -1이 출력되는대, 코드상의 원인이나 논리의 오류를 찾지 못하겠습니다... 혹시 도와주실 분 계신가요?

epson220 avatar Dec 14 '21 16:12 epson220