본문 바로가기
프로그래밍/이것이 코딩테스트다

이것이 코딩테스트다 5일차 - 구현 문제

by 수삼이는코딩중 2023. 7. 6.
728x90

<3> 게임 개발


너무 복잡해서 일단 구현부터 했다

# N,M을 공백으로 구분하여 입력받기
n,m = map(int, input().split())

# 방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [[0]*m for _ in range(n)]
# 현재 캐릭터의 x좌표, y좌표, 방향을 입력받기
x,y,direction = map(int,input().split())
d[x][y]=1 #현재 좌표 방문 처리

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

# 북, 동, 남, 서 방향 정의
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 #turn_time이 4번 되면 멈춤
while True : 
  #왼쪽으로 회전(가나 안 가나 어차피 다 돌아야 함)
  turn_left()
  nx = x + dx[direction]
  ny = y + dy[direction]

  #회전한 이후 정면에 가보지 않은 칸이 존재하는 경우 이동
  if d[nx][ny] == 0 and array[nx][ny]==0 : 
    d[nx][ny]=1
    x=nx
    y=ny
    count += 1
    turn_time = 0 #이동후 turn_time 초기화
    continue

  #회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
  else : 
    turn_time +=1 #회전만 했다는 뜻

  #네 방향 모두 갈 수 없는 경우
  if turn_time ==4 : 
    #뒤로 갈 수 있다면 이동하기
    nx = x - dx[direction]
    ny = y - dy[direction]
    if array[nx][ny] == 0 : #육지인 경우(방문여부상관x)
      x = nx
      y = ny

    #뒤로 바다로 막혀있는 경우
    else : 
      break
    turn_time=0 # turn_time 초기화
    


몰랐던 것

  • 문제 이해를 잘 해야 되는 구나. 예를들어 모든 칸을 이미 가본 칸이거나 바다로 되어있는 칸이기 전까지는 (아무튼 회전한 count가 4가되면) 왼쪽으로 무조건 회전한다는 것
  • turn_time 초기화를 잘 사용해야 한다는 것. turn_time에 따라서 회전과 전진을 반복할지 멈추거나 한칸 뒤로갈지가 정해지기 때문
  • 바다와 방문을 어떻게 구분할까 고민했는데, 맵을 하나 더 만들었다.
  • 회전 후 전진과 그냥 회전을 어떻게 구분할까 했는데 일단 회전하고 전진할지 말지를 정하면 되었다 (이건 ‘일단 회전은 한다’는 걸 이해 못했기 때문에 나온 고민)
  • 어쩌면 복잡해 보이는 것이 힌트가 될 수 있다. 예를 들어 1단계로 돌아가기 전에 수행하는 것 등. 전진 하나 하지 않나 회전은 한다는 것을 힌트로 준 셈,,,ㅜ 나는 거기서 뇌가 멈춰 버렸고..

질문

  1. 3번으로 어떻게 넘어가는 거지? 일단 1단계로 돌아가라는 말은 있지만 ’4방향 모두 이미 가본 칸이거나 ‘를 언제 확인 하라는 거지?
  2. ’바라보는 방향을 유지한채‘라고 했는데 회전부터 하고 if문으로 가는 걸,,?
  3. 1단계로 가라고 했는데 if 문을 무조건 만나는데,,?


  1. (2,3번의 답도 됨) ‘바라보는 방향을 유지한채’ 한칸 뒤로 가거나 말거나를 수행하려면 while문을 한번 더 돌지 않아서 회전을 수행하지 않고 if 문을 만나 이동하거나 말거나 하면 된다.


끝…

댓글