본문 바로가기
연습

[구현] 게임 개발

by ybs 2021. 11. 8.
반응형

N x M 크기의 2차원 배열에서 규칙에 따라 캐릭터를 이동시키고, 캐릭터가 방문한 칸의 수를 출력한다(3 <= N, M <= 50).

- 2차원 배열(맵)은 0(육지)와 1(바다)로 되어있다. 0(육지)은 갈 수 있고 1(바다)은 갈 수 없다.

- 맵의 각 칸은 (A, B) 로 나타낼 수 있다. A는 북쪽으로부터 떨어진 칸의 개수, B는 서쪽으로부터 떨어진 칸의 개수다.

- 캐릭터는 상하좌우로 움직힐 수 있다.

- 현재 위치에서 현재 방향을 기준으로 왼쪽 방향(반시계 방향으로 90도 회전한 방향)부터 차례대로 갈 곳을 정한다.

- 방향 d 는 0(북쪽), 1(동쪽), 2(남쪽), 3(서쪽) 4가지 값이 존재한다.

- 캐릭터의 바로 왼쪽 방향에 아직 가보지 않은 칸이 존재하면, 왼쪽 방향으로 회전한 다음 왼쪽으로 한 칸을 전진한다. 왼쪽 방향에 가보지 않은 칸이 없다면, 왼쪽 방향으로 회전만 수행한다.

- 만약 네 방향 모두 이미 가본 칸이거나 바다로 되어 있는 칸인 경우에는, 바라보는 방향을 유지한 채로 한 칸 뒤로 간다. 단 이때 뒤쪽 방향이 바다인 칸이라 뒤로 갈 수 없는 경우에는 움직임을 멈춘다.

 

입력 예시
4 4     4x4 배열
1 1 0   (1,1)에 북쪽(0)을 바라보고 서 있는 캐릭터
1 1 1 1 맵형태 
1 0 0 1
1 1 0 1
1 1 1 1

출력 예시
3

 

정답 코드를 보면 기록용 배열(d) 을 입력받은 맵(array)와 똑같이 안만들었다. 그래서 다음 칸을 갈 수 있는지 없는지를 확인하기 위해 d를 쓸건지, array를 쓸건지가 헷갈렸다. 그리고 continue 구문은 꼭 필요하진 않다. 그게 없어도 turn_time 이 0이 되므로 걸리는곳이 없기 때문이다.

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


# flag 용 배열 초기화
d = [[0] * m for _ in range(n)]

x, y, direction = map(int, input().split())

# 입력 받은 첫 좌표 기록
d[x][y] = 1


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

# 0(북쪽), 1(동쪽), 2(남쪽), 3(서쪽)
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def turn_left():
	global direction
	direction -= 1
	if direction == -1:
		direction = 3

count = 1
turn_time = 0
while True:
	# 왼쪽으로 먼저 돌고(direction 변경)
	turn_left()
	print("direction : ", direction)
	# 이동
	nx = x + dx[direction]
	ny = y + dy[direction]
	print("turn_time :", turn_time)
	print("nx :" , nx)
	print("ny :" , ny)

	# 갈수 있는 곳이면
	if d[nx][ny] == 0 and array[nx][ny] == 0:
		d[nx][ny] = 1
		x = nx
		y = ny
		count += 1
		turn_time = 0
		continue
	else:
		turn_time += 1

	if turn_time == 4:
		# 방향 유지하고 뒤로 한칸 이동
		nx = x - dx[direction]
		ny = y - dy[direction]

		# 뒤로 갈수 없는지 확인
		if array[nx][ny] == 0:
			x = nx
			y = ny
			
		# 더이상 갈 곳이 없음
		else:
			break
		turn_time = 0

print(count)

 

출처 : 이것이 코딩테스트다 나동빈 저

반응형

'연습' 카테고리의 다른 글

[구현] 문자열 재정렬  (0) 2021.11.21
[구현] 럭키 스트레이트  (0) 2021.11.14
[구현] 왕실의 나이트  (0) 2021.10.31
[그리디] 숫자 카드 게임  (2) 2021.10.24
[그리디] 무지의 먹방 라이브  (0) 2021.10.17