코딩테스트👩💻
[이코테] 구현_part2:게임개발
여니드
2022. 3. 7. 16:28
문제유형: 삼성 전자의 전형적인 시뮬레이션 문제
1. 내 풀이(풀이 단계적 힌트 참고)
#n,m을 공백으로 구분해서 입력받기
n,m = map(int, input().split())
x,y,direction = map(int, input().split())
#방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [ [0] * m for _in range(n) ]
#현재 좌표 값 방문 처리(0->1)
d[x][y] = 1
#전체 맵 정보를 입력받음(이 부분까지 입력받지는 몰랐네)
array = []
for i in range(n):
array.append(list(map(int, input().split())))
#책에 나와있는 대로 '북동남서' 방향 정의(인덱스는 direction, direction= 0,1,2,3에 각각 해당)
dx = [-1, 0, 1, 0]
dy = [0,1,0,-1]
#왼쪽으로 회전하는 함수 정의
def turn_left():
global direction #direction이 함수 밖에서 생성되었기 때문에
direction -=1
if direction ==-1:
direction =3
#시뮬레이션 시작
count = 1
turn_time =0 #회전한 숫자
while True:
#왼쪽으로 회전
turn_left()
#이동한 x,y좌표 생성
nx = x+dx[direction]
ny = y+dy[direction]
#회전한 이후 정면에 가보지 않은(d[nx][ny]==0) 육지(array[nx][ny]==0)가 존재하는 경우 이동
if d[nx][ny] ==0 and array[nx][ny]==0:
d[nx][ny] =1 #방문했음을 표시
#현재 좌표를 변경
x = nx
y = ny
count+=1 #방문한 칸의 수 +1
turn_time=0 #회전 초기화
continue
#회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우=> 일단 한번 더 회전해야 함
else:
turn_time+=1 #방향 회전하는 수 +1
#네 방향 모두 갈 수 없는 경우=> 방향은 유지하고 한 칸 뒤로 이동
if turn_time==4:
nx = x - dx[direction]
ny = y - dy[direction]
if d[nx][ny]==1 or array[nx][ny]==1: break #뒤쪽 방향이 바다이거나 이미 가본 칸이면 움직임 멈춤
else:
x,y= nx,ny
turn_time=0
continue
print(count)
2. 모범 답안
#n,m을 공백으로 구분해서 입력받기
n,m = map(int, input().split())
x,y,direction = map(int, input().split())
#방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [ [0] * m for _in range(n) ]
#현재 좌표 방문 처리
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 #회전한 숫자
while True:
#왼쪽으로 회전
turn_left()
nx = x+dx[direction]
ny = y+dy[direction]
#회전한 이후 정면에 가보지 않은(d[nx][ny]==0) 육지(array[nx][ny]==0)가 존재하는 경우 이동
if d[nx][ny] ==0 and array[nx][ny]==0:
d[nx][ny] =1 #방문했음을 표시
#현재 좌표를 변경
x = nx
y = ny
count+=1 #방문한 칸의 수 +1
turn_time=0 #회전 초기화
continue
#회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
else:
turn_time+=1 #방향 회전하는 수 +1
#네 방향 모두 갈 수 없는 경우
if turn_time==4:
nx = x-dx[direction]
ny = y-dy[direction]
#뒤로 갈 수 있다면 이동 후 1단계로 돌아간다.
if array[nx][ny] ==0:
x = nx
y = ny
#뒤가 바다라 못가는 경우
else:
break
turn_time=0
print(count)
피드백:
이런 지문이 긴 문제들은 주어진 조건대로 차근차근 충실하게 코딩하는게 답인 것 같다.