코딩테스트[파이썬]/이것이 코딩테스트다(이코테)

[구현] 상하 좌우

softmoca__ 2024. 1. 25. 12:35
목차

N x N 크기의 정사각형 공간이 있고 가장 왼쪽 좌표는 (1,1) 가장 오른쪽 아래 좌표는 (N,N)이다.

상,하,좌,우로 이동할 수 있으며, 시작 좌표는 항상 (1,1)dlek.

 

이동할 계획서에는 L,R,U,D 중 하나의 문자가 반복적으로 적혀 있다.

L : 왼쪽으로 한칸 이동

R : 오른쪽으로 한칸이동

U : 위로 한칸 이동

D : 아래로 한칸 이동

 

단, 이동 명령이 공간을 벗어나는 명령이 오면 무시한다.

ex) (1,1)에 있다가 L 혹은 U를 명령하는 경우

 

명령어를 모두 수행한 후 현재 좌표를 출력 하시오.

 

입력 조건 )

첫째 줄에 공간의 크기를 나타내는 N이 주어진다

둘쨰 줄에 계획서의 명령이 주어진다.

 

입력 예시)

5

R R R U D D

 

출력 예시)

3 4

 

 

나의 코드

N=int(input())

arr=[[0]*N for _ in range(N)]

plan=list(map(str,input().split()))
x,y=0,0
dx=[-1,0,1,0]
dy=[0,1,0,-1]

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

for z in plan:
    for k in range(4):
        if z==dir[k]:
            nx=x+dx[k]
            ny=y+dy[k]
            if 0<=nx<N and 0<=ny<N:
                x=nx
                y=ny

print(x+1,y+1)

문제의 조건대로 차례대로 이동을 시켰다.

공간을 넘어가는 명령이 오는 경우 무시한다는 조건을 위해 시물레이션한 좌표가 0과 N 사이일 경우에만 이동을 시켰다.

 

 

정답 코드

# 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)

위 문제의 요구 사항대로 구현하면 연산횟수는 이동 횟수에 비례하게 된다. (O(N)의 시간 복잡도)

나의 코드와의 차이점은 나는 시작 위치를 0,0으로 시작하여 마지막 출력 값에 1을 각각 더해 줬지만 정답 코드에서는 초기 공간 좌표를 한 칸 더 넓게 세팅한 후 시작을 1,1로 시작하였다.

 

위와 같은 간단한 문제에서는 나의 코드처럼 0,0으로 시작해서 출력 값을 나의 머리 속에 있는 기억으로 1을 더 해줬지만

이후 더 복잡한 구현문제 같은 경우에는 문제에서 주어진 값대로 공간의 좌표를 시작하는게 더 좋을것 같다.