♻️Implementation - 상하좌우

dev_itzel_02✨·2024년 11월 14일

♻️Algorithm

목록 보기
6/12
post-thumbnail

🏷️Implementation

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


🏷️상하좌우

여행가 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 크기의 정사각형 공간을 벗어나는 움직임은 무시된다. 
계획서가 주어졌을 때 여행가 A가 최종적으로 도착할 지점의 좌표를 출력하는 프로그램을 작성하시오.

🔹입력 조건

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

🔹출력 조건

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

🔹입력 예시

5
R R R U D D

🔹출력 예시

3 4

🧐접근 방향

  • 이동 방향 타입을 리스트로 정의한다.
  • 이동 방향 별로 움직여야 하는 좌표 크기를 x, y 축별로 미리 정의한다.
  • 이동 계획을 반복문으로 하나씩 확인하여 이동 방향 타입을 정의해놓은 리스트에서 같은 타입의 인덱스를 찾는다.
  • 현재 위치에서 좌표를 이동시킨 후 이동한 좌표를 새로운 변수에 담아둔다.
  • 정사각형 크기를 벗어나는지 조건문으로 확인한 후
    • 벗어난다면 👉🏼 무시 continue
    • 벗어나지 않는다면 👉🏼 현재 위치 갱신

📑나의 답안

# 공간 크기 입력받기
n = int(input())
move_plans = list(input().split()) # list 함수 굳이 사용 필요 X

# 이동 방향 정의 
move_types = ['L', 'R', 'U', 'D']
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]

# 출발 위치는 항상 (1, 1)
x, y = 1, 1

# 이동 계획 수행
for move_plan in move_plans:
    idx = move_types.index(move_plan) # 문자 인덱스 찾기
    nx = x + dx[idx]
    ny = y + dy[idx]

    # 정사각형을 벗어나는지 확인
    if (nx >= 1 and nx <= n and ny >= 1 and ny <= n):
        x = nx
        y = ny
    else:
        continue

print(x, y)

👉🏼 공백으로 구분해 여러 개의 입력값을 입력받는 경우는 list로 변환하지 않아도 리스트로 생성된다.


📑예제 답안

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)

👉🏼 예제 답안 같은 경우는 2중 for문을 사용하였다. plansmove_types를 반복문으로 리스트 요소를 하나씩 꺼내와 두 개의 요소가 같은지 비교하는 방식을 사용하였고, 나의 풀이는 index 함수를 사용하여 해당 리스트에 특정 값의 인덱스를 찾는 방식을 사용하였다.


👣Reference

  • 이것이 코딩 테스트다 with 파이썬
profile
🐜👣steadiness🐜👣

0개의 댓글