Skip to main content

구현_상하좌우

  • 완전 탐색: 모든 경우의 수를 주저 없이 다 계산하는 해결 방법
  • 시뮬레이션: 문에서 제시한 알고리즘을 한 단계씩 차례대로 직접 수행

int 자료형 데이터의 개수에 따른 메모리 사용량

  • 데이터의 개수(리스트의 길이) 1,000일 때 메모리 사용량 약 4KB
  • 데이터의 개수(리스트의 길이) 1,000,000일 때 메모리 사용량 약 4MB
  • 데이터의 개수(리스트의 길이) 10,000,000일 때 메모리 사용량 약 40MB

문제

note

여행가 A는 N X N 크기의 정사각형 공간 위에 서 있다. 이 공간은 1 X 1 크기의 정사각형으로 나누어져 있다. 가장 왼쪽 위 좌표는 (1, 1)이며, 가장 오른쪽 아래 좌표느 (N, N)에 해당한다. 여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1, 1)이다. 우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여 있다.

계획서에는 하나의 줄에 띄어쓰기를 기준으로 하여 L, R, U, D 중 하나의 문자가 반복적으로 적혀 있다. 각 문자의 의미는 다음과 같다.

  • L: 왼쪽으로 한 칸 이동
  • R: 오른쪽으로 한 칸 이동
  • U: 위로 한 칸 이동
  • D: 아래로 한 칸 이동

이때 여행가 A가 N X N 크기의 정사각형 공간을 벗어나는 움직임은 무시된다. 예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시된다.

나의 풀이


n = int(input()) # 공간의 크기 입력
command = list((input().split())) # L, R, U, D 명령 입력

# 배열 생성
l = [[0 for _ in range(n)] for _ in range(n)]
# 현재 좌표 지정
point_x, point_y = 0, 0
# 배열 내 현재 좌표 위치 1로 표시
l[point_x][point_y] = 1

# L, R, U, D 순으로 이동할 시 현재 좌표에 더할 값 리스트
move = [(0, -1), (0, 1), (-1, 0), (1, 0)]
list_len = len(l)

for order in command:
if order == 'R':
# 다음 이동할 좌표 변수 생성
next_point_x, next_point_y = point_x + move[1][0], point_y + move[1][1]
# 다음 이동할 좌표가 범위 내에 존재할 경우 이동
if 0 <= next_point_x < list_len or 0 <= next_point_y < list_len:
# 오른쪽으로 한 칸 이동
point_y += 1
# 배열 좌표에 이동한 위치 표시
l[point_x][point_y] = 1
else:
# 만약 이동할 좌표가 범위 내에 포함되어 있지 않다면 범위를 벗어나는 것이므로 다음 명령어 루프 수행
continue
if order == 'L':
next_point_x, next_point_y = point_x + move[0][0], point_y + move[0][1]
if 0 <= next_point_x < list_len or 0 <= next_point_y < list_len:
point_y -= 1
l[point_x][point_y] = 1
else:
continue
if order == 'U':
next_point_x, next_point_y = point_x + move[2][0], point_y + move[2][1]
if 0 <= next_point_x < list_len or 0 <= next_point_y < list_len:
point_x -= 1
l[point_x][point_y] = 1
else:
continue
if order == 'D':
next_point_x, next_point_y = point_x + move[3][0], point_y + move[3][1]
if 0 <= next_point_x < list_len or 0 <= next_point_y < list_len:
point_x += 1
l[point_x][point_y] = 1
else:
continue

# 현재 좌표가 (1, 1)이 아닌 (0, 0)을 기준으로 하였으므로 각각 1 증가
print(point_x+1, point_y+1)

동빈나 풀이

# N을 입력받기
n = int(input())
x, y = 1, 1
plans = input().split()

# L, R, U, D에 따른 이동 방향
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)