머리속으로는 쉽게 생각할수 있지만 코드로 짜기 힘든 문제의 유형
완전 탐색 , 시뮬레이션 문제
여행가 A 는 N*N 크기의 정사각형 공간 위에 서있다.
이 공간은 1 x 1 크기의 정사각형으로 이루어져있다.
가장 왼쪽 위의 좌표는 (1,1) 이며 , 가장 오른쪽 아래는 N X N 에 해당한다.
A 는 상하좌우 방향으로 이동이 가능 , 시작 좌표는 항상 (1,1) 에서 시작한다.
계획서에는 L,R,U,D 중 하나의 문자가 반복적으로 적혀 있다.
문제 에서는 공간의 크기 N 과 계획서에 관련된 내용이 주어졌을떄 A의 최종 도착 지점의 좌표를 출력하는 프로그램을 작성하는 프로그램을 작성하시오
# 맵의 크기
n = int(input())
# 시작점
x,y = 1,1
# 이동 방향
plans = input().split()
#명령에 따른 이동 방향 x:의 이동 / y:행의 이동
dx = [0,0,-1,1] # 행의 이동에서 U , D 만 값이 부여
dy = [-1,1,0,0] # 열의 이동은 L , R 일떄만
# 파이썬에는 list.index 를 통해 이동 방향에 대한 index 를 알수 있다.
move_types = ['L','R','U','D']
for plan in plans:
for move in move_types:
if plan == move:
idx = move_types.index(plan)
nx = x + dx[idx]
ny = y + dy[idx]
if nx < 1 or ny < 1 or nx > n or ny > n: # 탐색 맵에서 벗어난 범위는 넘어가는 시스템
continue
x,y = nx,ny # 좌표 이동
print(x,y)
n = int(input())
count = 0
for i in range(n+1):
for j in range(60):
for k in range(60):
print(f'{i}시 {j}분 {k}초')
if '3' in str(i) or '3' in str(j) or '3' in str(k):
count += 1
print(count)
수평으로 두칸 이동한 후에 수직으로 한 칸 이동하기
수직으로 두칸 이동한 후에 수평으로 한칸 이동하기
좌표 평면 행의 위치는 1 ~ 8 로 표현 열의 위치는 a ~ h 로 표현 한다.
첫쨰 줄에 나이트위치가 주어질떄 이동 가능한 경우의 수를 구하는 프로그램을 작성하시오.
location = input()
xs = ['a', 'b', 'c', 'd', 'e', 'f', 'h']
ys = ['1', '2', '3', '4', '5', '6', '7', '8']
x = xs.index(location[0])
y = ys.index(location[1])
# 나이트 로 이동 할수 있는 경우는 총 8가지 이다.
dx = [-2, -2, -1, 1, 2, 2, -1, 1]
dy = [-1, 1, 2, 2, -1, 1, -2, -2]
count = 0
for i in range(8):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < 8 and 0 <= ny < 8:
count += 1
print(count)
현민이는 게임 캐릭터가 맵 안에 움직이는 시스템을 개발중이다.
크기가 N X M 으로 직사각형으로 각각의 칸은 육지 또는 바다이다.
캐릭터는 동서남북 중 한곳을 바라본다.
맵의 각 칸은 (A,B) 으로 나타낼수 있으며 A 는 북쪽에서 떨어진 정도
B는 서쪽으로 떨어진 정도 를 나타낸다.
캐릭터는 상하좌우 이동이 가능하다 + 바다로 이루어진 공간은 이동할수 없다.
캐릭터는 다음과 같은 메뉴얼로 이동한다.
현재 위치에서 현재 방향을 기준으로 왼쪽 방향 (반시계 방향으로 90 도 이동하여 차례대로 갈 곳을 정한다)
캐릭터 왼쪽에서 아직 가보지 않은 칸이 존재 한다면 왼쪽 방향으로 이동후에 왼쪽으로 한칸 전진한다. 왼쪽 방향에 가보지 않은 칸이 없다면 , 왼쪽 방향으로 회전만 수행하고 1단계로 돌아간다.
만약 네 방향 모두 이미 가본 칸이거나 바다로 되어 있는 칸인 경우에는 바라보는 방향을 유지한 채로 한 칸 뒤로 가고 1단계로 돌아간다. 단 이떄 뒤쪽 방향으로 갈수 없는 경우에는 움직임을 멈춘다.
첫쨰 줄에 지도 의 크기가 N,M 으로 주어진다
둘쨰 줄 부터 게임 캐릭터가 있는 칸의 좌표와 바라보는 방향 d가 각각 서로 공백으로 구분하여 주어진다 d 의 값은 다음과 같다.
0: 북쪽
1: 동쪽
2: 남쪽
3: 서쪽
셋째 줄 부터 맵이 육지인지 바다인지 입력한다 = 맵의 정보를 입력
0: 육지
1: 바다
n, m = map(int, input().split())
x, y, d = map(int, input().split())
visited = [[0] * m for _ in range(n)]
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
map = [list(map(int, input().split())) for _ in range(n)]
# 현재 위치를 방문 처리
visited[x][y] = 1
# 왼쪽으로 이동 표현
def turn_left():
global d
d -= 1 # 왼쪽으로 90도 회전은 -1 차감 한것과 똑같다
if d == -1: # 단 이떄 0 -> 3 으로 갈떄는 if 조건문을 사용하여 3으로 초기화
d = 3
count = 1
turn_time = 0
while True:
turn_left() # 왼쪽으로 이동
nx = x + dx[d]
ny = x + dy[d]
if d[nx][ny] == 0 and map[nx][ny] == 0:
d[nx][ny] = 1
x,y = nx,ny
count += 1
turn_time = 0
continue
else:
turn_time += 1
if turn_time == 4: # 네방향 전부 이동 불가인경우
nx = x - dx[d]
ny = y - dy[d]
if map[nx][ny] == 0: # 뒤로 이동 할수 있는경우
x,y = nx,ny
else: # 뒤에가 바다인경우
break
turn_time = 0
print(count)