종식당

[이코테 - 구현] 상하좌우 본문

이코테

[이코테 - 구현] 상하좌우

종식당 2024. 1. 25. 15:40
728x90
반응형

 

알고리즘 구현 문제에서 자주 출제되는 내용 중 하나인 좌표풀이 문제이다. 이전에도 좌표 관련 문제를 본 적이 많아 이번에 이 문제를 통해 정리해두려고 한다.

먼저 문제를 보면 첫 번째 줄에 좌표 평면의 크기를 입력을 받고 두 번째 줄에 이동 계획을 입력받는다. 출력으로는 최종 좌표를 출력하면 된다.

 

  • 좌표의 단위 벡터를 이용하여 문제를 풀기

dx = [0,0,-1,1]

dy = [-1,1,0,0]

 

위 dx, dy 관련해서는 계속 헷갈렸는데 처음에 나는 좌표 개념으로 접근해서 계속 헷갈린 것이었다.

이는 좌표로 접근하면 안 되고 행렬개념으로 접근해야 이해를 할 수 있다. dx를 행, dy를 열이라고 생각하면 dx가 감소하면 행이 감소하므로 U, 즉 위쪽 방향으로 간다고 생각하면 되고 증가하면 행이 증가하므로 D, 아래쪽 방향으로 간다고 생각하면 된다. 똑같이, dy가 감소하면 열이 감소한다고 생각하여 L, 왼쪽 방향으로 가고 dy가 증가하면 열이 증가하여 오른쪽으로 간다고 생각하면 된다!!!

 

그리고 move배열에 ['L', 'R', 'U', 'D']를 저장해 주자.

이후 for문으로 입력받은 계획을 돌리고 이들 중 move배열에 포함되면 nx = x + dx [i], ny = y + dy [i]로 nx, ny를 구해준다.

이때 좌표평면을 벗어나는 경우는 무시해야 하기 때문에 if nx < 1 or ny < 1 or nx > n or ny > n: continue를 작성해 준다.

마지막으로 x, y = nx, ny를  대입해 주면 끝이다.

 

  • 답안 코드
n = int(input())
x, y = 1,1

plan = input().split()

dx = [0,0,-1,1]
dy = [-1,1,0,0]

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

for i in plan:
    for j in range(len(move)):
        if i == move[j]:
            nx = x + dx[j]
            ny = x + dy[j]

    if nx < 1 or ny < 1 or nx > n or ny > n:
        continue

    x,y = nx,ny
print(x,y)

 

아직 헷갈리는 부분이 있어서 관련 문제를 좀 더 많이 풀어봐야 할 것 같다.

728x90
반응형