chae._.chae

구현 문제 (지도에서 동서남북 이동문제 모음) 본문

파이썬 알고리즘

구현 문제 (지도에서 동서남북 이동문제 모음)

walbe0528 2021. 12. 19. 17:58
728x90
반응형

문제1) 단, 지도를 벗어나는 움직임은 무시한다.

 

 

N = int(input())
x, y = 1, 1
plans = input().split()  # 어떻게 움직일 것인지 입력받음
#   서, 동, 북, 남
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]

move_types = ['L', 'R', 'U', 'D']

for plan in plans:
    for i in range(len(move_types)):
        if plan == move_types[i]:
            nx = x + dx[i]
            ny = y + dy[i]
    if nx < 1 or ny < 1 or nx > N or ny > N:  # 범위를 벗어난 경우
        continue
    x, y = nx, ny

print(x, y)

 

 

문제2)

 

 

1번과는 다르게 입력된 위치가 모두 숫자가 아니라, 숫자+문자인 조금 더 까다로운 문제이다.

 

'''
입력위치 행과 열이 모두 숫자가 아니라 문자와 함께 있는 경우
'''

position = input()   #a
row = int(position[1])  #1
#column = int(ord(position))-int(ord('a'))+1  position에 두개 다 들어가서 X
# ord()함수 : 문자열을 아스키코드로 반환
# chr()함수 : 아스키코드를 문자열로 반환
column = int(ord(position[0]))-int(ord('a'))+1

# 이동할 수 있는 8가지 방향, dx,dy를 대신하여 사용되는 방법
steps = [(1,2), (-1,2), (2,-1), (2,1), (-1,-2), (1,-2), (-2,-1), (-2,1)]

result = 0
for step in steps:
    next_row = row + step[0]
    next_column = column + step[1]
    if (next_row >=1 and next_row <= 8 and next_column >=1 and next_column <= 8 ):
        result += 1

print(result)

 

 

 

문제3)

NxM 크기의 맵에서 각 칸을 육지와 바다로 나누어 이동할 수 있는 위치를 계산해 총 몇 칸을 방문했는지 구하는 문제이다. (0은 육지, 1은 바다) 입력값으로 맵의 크기, 사용자의 위치와 방향, 맵의 상태를 받는다.

 

1. 현재위치에서 반시계방향 90도로 회전한 방향부터 이동방향을 결정한다.

2. 앞으로 갈 수 있다면 1칸 전진하고, 가지 못한다면 회전만 수행하고 1로 돌아간다.

3. 네칸 모두 가봤거난 바다로 되어있다면, 방향은 유지하고 한칸 뒤로 가고 1로 돌아간다. 단, 뒤쪽이 바다라 이동할 수 없다면 게임을 종료한다.  

 

 

N, M = map(int, input().split())
x, y, direciton = map(int, input().split())

# 맵을 생성하여 모두 0으로 초기화시켜준다. ***
d = [[0]*M for _ in range(N)]
d[x][y] = 1  # 현재위치 방문처리

# 맵의 정보 입력받기. 0은 육지, 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]
   	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:  # 여기서 d는 방문여부 체크, array는 맵의 육지/바다를 나타내줌
        	x = nx
            y = ny
        else:  
        	break
		turn_time = 0
       
print(count)
728x90

'파이썬 알고리즘' 카테고리의 다른 글

최단경로 알고리즘  (0) 2022.02.24
이코테 - [만들 수 없는 금액]  (0) 2022.02.03
정렬  (0) 2021.12.24
그래프 탐색 알고리즘 - DFS, BFS  (0) 2021.12.20