난이도 ♦︎♢♢ | 풀이시간 15분 | 시간제한 1초 | 메모리제한 128MB
[문제]
여행가 A는 N × N 크기의 정사각형 공간 위에 서 있다. 이 공간은 1 × 1 크기의 정사각형으로 나누어져 있다.
가장 왼쪽 위 좌표는 (1, 1)이며, 가장 오른쪽 아래 좌표는 (N, N)에 해당한다.
여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1, 1)이다.
우리 앞에는 여행가 A가 이동할 계획이 적힌 계획서가 놓여 있다
계획서에는 하나의 줄에 띄어쓰기를 기준으로 L, R, U, D 중 하나의 문자가 반복적으로 적혀있다.
각 문자의 의미는 다음과 같다
L: 왼쪽으로 한 칸 이동
R: 오른쪽으로 한 칸 이동
U: 위로 한 칸 이동
D: 아래로 한 칸 이동
이때 여행가 A가 N × N 크기의 정사각형 공간을 벗어나는 움직임은 무시된다.
예를 들어 (1, 1)의 위치에서 L 혹은 U를 만나면 무시된다.
다음은 N = 5인 지도와 계획이다
[입력조건]
- 첫째 줄에 공간의 크기를 나타내는 N이 주어진다. (1<=N<=100)
- 둘째 줄에 여행가 A가 이동할 계획서 내용이 주어진다. (1<=이동 횟수<=100)
[출력조건]
- 첫째 줄에 여행가 A가 최종적으로 도착할 지점의 좌표(X, Y)를 공백으로 구분하여 출력한다.
[해설]
- 문제를 요구사항대로 구현하면 연산횟수는 이동횟수에 비례하게된다.
- 이동횟수가 N번 인 경우 시간 복잡도는 O(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)
[느낀점]
아직 알고리즘 문제에 익숙하지 않다보니 어떤식으로 코드를 구현하도록해야하는지
어떻게 구성하는게 조금이라도 복잡도를 줄일 수있는 효율적인 방법인지에 대하여 생각하는게 오래걸렸다
조금씩 익숙해질때까지 계속해서 문제를 풀려고 시도하는 게 가장 중요할 것같다는 생각이든다.
이런 문제 유형들이 익숙해질수있도록 연습해보고 구현 코드들을 잘 검토해보고 디버깅해볼 필요가 있겠다.
구현문제같은 경우에는 노가다 처럼 하나하나 조건들을 코드로 만들어내는 게 중요하다보니까 더욱이 그런 조건들이나 결론적으로 출력하고자하는 결과가 무엇인지를 판단해 내는게 가장 중요하겠다는 생각이 든다.
꼼꼼하게 잘 살펴보며 문제를 풀 수 있기를
'Study Log > 코딩테스트' 카테고리의 다른 글
[구현] 왕실의 나이트 (0) | 2023.05.10 |
---|---|
[구현] 시각 (0) | 2023.05.09 |
[그리디] 1이 될 때까지 (0) | 2023.04.17 |
[그리디] 숫자 카드 게임 (0) | 2023.04.17 |
[그리디] 큰 수의 법칙 (0) | 2023.04.12 |