상하좌우

뚝딱이·2022년 7월 23일
0

코딩 테스트 준비

목록 보기
5/8

문제

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

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

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

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

계획서가 R->R->R->U->D->D라고 하고 N=5라고 하면 여행가는 (1,2),(1,3),(1,4),(2,4),(3,4) 순으로 움직여 최종적으로 여행가 A는 (3,4)에 도착할 것이다.

계획서가 주어졌을 때 여행가 A가 최종적으로 도착할 지점의 좌표를 출력하는 프로그램을 작성하시오.

입력조건

  • 첫째 줄에 공간의 크기를 나타내는 N이 주어진다. (1 \leq N \leq 100)
  • 둘째 줄에 여행가 A가 이동할 계획서 내용이 주어진다. (1 \leq 이동 횟수 \leq 100)

출력 조건

  • 첫째 줄에 여행가 A가 최종적으로 도착할 지점의 좌표 (X,Y)를 공백으로 구분하여 출력한다.

입력 예시

5
R R R U D D 

출력예시

3 4

내 풀이


n=int(input())
move=list(input().split())
result=[1,1]

for i in move:
    if i == 'R':
        if result[1]+1>n:
            continue
        else : result[1]+=1
    elif i == 'L':
        if result[1]-1<1:
            continue
        else : result[1]-=1
    elif i == 'D':
        if result[0]+1>n:
            continue
        else : result[0]+=1
    elif i == 'U':
        if result[0]-1<1:
            continue
        else : result[0]-=1

print(result[0],result[1])

예시 답안

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)

지금은 내 풀이가 더 간단하게 생각하기 좋아보이는 듯한데 로직이 더 복잡해지면 답안의 방식대로 푸는것이 간편할 것 이다. 실제로 뒤의 왕실의 나이트 문제를 풀 때 응용했다.

dx와 dy를 위와 같은 방식으로 설정하는 발상이 조금 어려울 것 같다.

profile
백엔드 개발자 지망생

0개의 댓글