Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 백준
- 코테
- 지도학습
- 캐싱
- 해시
- 이진탐색
- 코딩테스트
- 코딩
- BOJ
- rest api
- 딕셔너리
- 파이썬 오류
- 알고리즘
- 머신러닝
- 멱등
- bineary search
- 강화학습
- 깊이우선탐색
- Merge sort
- 너비우선탐색
- 프로그래머스
- 자바
- 파이썬
- 스택과 힙
- 파이썬 알고리즘
- 딥러닝
- post
- 오버라이딩
- HTTP
- 비지도학습
Archives
- Today
- Total
chae._.chae
구현 문제 (지도에서 동서남북 이동문제 모음) 본문
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 |