[코테 공부] 구현 Implementation_4

Yujin Lee·2021년 4월 4일
0

CodingTest_Study

목록 보기
7/7
post-thumbnail

머리속 알고리즘을 소스코드로 바꿔라!



실전 문제

게임 개발

N x M 짜리 맵에서 방향을 가진 캐릭터가 매뉴얼에 따라 이동했을 때
여태까지 방문한 칸의 수를 구하라.

  • 입력 조건 : 첫째 줄에 맵의 세로 크기 N가로 크기 M을 공백으로 구분하여 입력한다. (N은 3이상, M은 50이하)

>>매뉴얼<<

  1. 현재 방향을 기준으로 반시계 방향으로 갈 곳을 정함
  2. 캐릭터 바로 왼쪽 칸이 안가본 곳이다? 👉🏻 왼쪽 한칸 이동 -> 1.로 돌아감
  3. 네 방향 모두 바다? OR 네 방향 모두 가본곳? 👉🏻 한칸 back하고 1.로 돌아감 (못돌아가면 게임 끝)
입력 예시 :
4 4       # 4 x 4 맵 생성
1 1 0     # (1, 1)에 북쪽(0)을 바라보고 서 있는 캐릭터
1 1 1 1   # 첫 줄은 모두 바다
1 0 0 1   # 둘째 줄은 바다/육지/육지/바다
1 1 0 1   # 셋째 줄은 바다/바다/육지/바다
1 1 1 1   # 넷째 줄은 모두 바다
출력 예시 :
3


문제 풀이

'''  >> 게임 개발 <<  '''

# N값, M값 입력
n, m = map(int, input().split())

# *****key*****
# 방문한 곳 저장해야 함
d = [[0] * m for _ in range(n)]

# 현재 위치 입력
x, y, dir = map(int, input().split()) # (A, B) direction 입력
d[x][y] = 1 # 현재 좌표를 방문한 곳으로 처리함(1)

# 맵 정보 입력
array=[]
for i in range(n):
    array.append(list(map(int, input().split())))

# *****key*****
# 북동남서 방향 정의
dx = [-1, 0, 1, 0] # dx는 아래로 한칸이니까
dy = [0, 1, 0, -1] # dy는 오른쪽으로 한칸이니까

# 왼쪽(반시계 방향)으로 회전
def turn_left():
    global dir
    dir -= 1
    if dir == -1:
        dir = 3

# 시뮬레이션 시작
count = 1
turn_time = 0
while True:
    # 왼쪽으로 회전
    turn_left()
    nx = x + dx[dir]
    ny = y + dy[dir]

    # 가보지 않은 칸이 존재하면 이동
    if d[nx][ny] == 0 and array[nx][ny] == 0:
        d[nx][ny] = 1 # 방문한 곳으로 처리 (1)
        x = nx
        y = ny
        count += 1 # 새로운 곳에 랜드마크 찍었으니까 count +1
        turn_time = 0
        continue

    # 주변이 다 가본 곳이거나 바다인 경우
    else:
        turn_time += 1

    # 네 방향 모두 갈 수가 없음
    if turn_time == 4:
        nx = x - dx[dir]
        ny = y - dy[dir]
        # 뒤로 갈 수 있으면 이동
        if array[nx][ny] == 0:
            x = nx
            y = ny
        # 뒤가 바다로 막히면 끝!
        else:
            break
        turn_time = 0

print(count)
profile
I can be your Genie🧞‍♀️ How ‘bout Aladdin? 🧞‍♂️

0개의 댓글

관련 채용 정보