티스토리 뷰

문제유형: 삼성 전자의 전형적인 시뮬레이션 문제

 

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)

 

피드백:

이런 지문이 긴 문제들은 주어진 조건대로 차근차근 충실하게 코딩하는게 답인 것 같다. 

댓글