- 맞다. 저번에 말한 것처럼 오늘 다룰 알고리즘은 '구현' 알고리즘이다. 말 그대로 구현하는 문제이기에 왜 배우나 싶을 수 있는데, 이런 구현의 문제는 요즘 코딩테스트의 추세를 보면, 사소한 입력 조건 등부터 시작해서 문제의 길이가 꽤 길게 나와 조건을 많이 명시해주면서 준다. 즉, 기본적인 문법 + 프로그램 모듈에 대한 이해도 + 더 나아가 웹 서버나 데이터 분석에 대한 기초 지식도 알고 있으면, 쉽게 풀 수 있을 것이다. 앞서 했던, 그리디 유형과 지금부터 할 구현 알고리즘은 코딩테스트에서 쉽게 풀 수 있도록 나오는 1,2 문제에 해당하기 때문에 다 맞출 수 있도록 공부하자!! 그럼 시작해보겠다.
1. 상하좌우
- 문제설명
여행가 A는 N X N 크기의 정사각형의 공간에 있다. 가장 왼쪽 위 좌표는 (1,1) 인데, L,R,U,D 로 왼쪽이나, 오른쪽, 위 그리고 아래로 한 칸씩 이동할 수 있다. 단, 정사각형의 공간을 벗어나는 움직임은 무시된다. 사용자로부터 이동할 계획서를 주어지면, 최종적으로 도착할 좌표를 구하면 된다.
-
입력조건
- 첫 째 줄에 공간의 크기를 나타내는 N이 주어진다. (1 <= N <= 100)
- 둘 째 줄에 여행가 A가 이동할 계획서 내용이 주어진다. (1 <= 이동 횟수 <= 100)
-
출력조건
- 첫째 줄에 A가 최종적으로 도착할 지점의 좌표 (X,Y)를 공백으로 구분하여 출력한다.
- 문제 풀이
위 문제를 푸는 방법은 간단하다. N을 입력받고, L,R,U,D를 입력받을 리스트를 하나 만든다. 물론, 리스트를 제작할 때 X,Y 방향으로 이동할 수 있게 한 쌍으로 받을 수 있도록 한다. (뒤에 코드를 보면 쉽게 이해할 수 있다.) 그 이후, 이동 계획을 하나씩 읽으며, 가능한 움직임일시 이동을 하고, 이동할 수 없는 조건이 생긴다면 continue를 활용해 반복문이 끝날 때까지 반복할 수 있도록 한다.
#다음 문제는 연산 횟수와 이동 횟수가 비례하기에, 시간 복잡도를 보자면 O(N)으로 나타낼 수 있다.
n = int(input())
x, y = 1, 1
plans = input().split()
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)