본문 바로가기

Study Log/코딩테스트

[구현] 상하좌우

728x90

난이도 ♦︎♢♢ | 풀이시간 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