코딩테스트

[파이썬(python)] 이것이 취업을 위한 코딩테스트다 게임 개발 118p

고후 2022. 2. 7. 11:46

이전에 풀었던 뱀 문제를 복습하려고 풀어봤다. 이번에는 예전 문제를 복습하는 거라 어렵지 않게 풀수있었다.

그런데, 맵의 외곽이 항상 바다로 구성되어 있기 때문에 캐릭터가 밖으로 떨어지지 못한다.

이 부분을 알고 있었다면 조금 더 쉽게 풀 수 있었을 것 같다.

 

 

n, m = map(int, input().split())
x, y, d = map(int, input().split())
game_map = []
for _ in range(n):
    game_map.append(list(map(int, input().split())))
    
dx = [0, 1, 0, -1]
dy = [-1, 0, 1, 0]
visit = []

def rotate(d):
    if d == 0:
        return 3
    else:
        return d-1
    


answer = 1
count = 0

visit.append([x, y])
while True:
    d = rotate(d)
    count += 1 # 방향 회전 수
    nx = x + dx[d]
    ny = y + dy[d]

    if 0 <= nx and nx < n and 0 <= ny and ny < m:
        if [nx, ny] not in visit and game_map[nx][ny] == 0:
            answer += 1
            visit.append([nx, ny])
            x, y = nx, ny
            count = 0
            continue
    else:
        break

    if count == 4:
        x = x - dx[d]
        y = y - dy[d]
        count = 0
        if 0 > x or x >= n or 0 > y or y >= m:
            break
        if game_map[x][y] == 1:
            break


print(answer)

 

답지를 보고 조금 더 개선한 코드는 아래와 같다.

 

n, m = map(int, input().split())
x, y, d = map(int, input().split())
game_map = []
for _ in range(n):
    game_map.append(list(map(int, input().split())))
    
dx = [0, 1, 0, -1]
dy = [-1, 0, 1, 0]
visit = []

def rotate(d):
    if d == 0:
        return 3
    else:
        return d-1
    


answer = 1
count = 0

visit.append([x, y])
while True:
    d = rotate(d)
    count += 1 # 방향 회전 수
    nx = x + dx[d]
    ny = y + dy[d]


    if [nx, ny] not in visit and game_map[nx][ny] == 0:
        answer += 1
        visit.append([nx, ny])
        x, y = nx, ny
        count = 0
        continue
    
    if count == 4:
        x = x - dx[d]
        y = y - dy[d]
        count = 0
        
        if game_map[x][y] == 1:
            break


print(answer)