상하좌우

Polla·2023년 1월 8일
post-thumbnail

" 이것이 코딩테스트다 with 파이썬" 연습

이것이 코딩테스트다 구매링크



문제

💡 문제

여행자 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)를 공백으로
	출력한다.
ex)
	5 
    R R R U D D  출력: 3 4


🥔 해결


우선 이 문제는 해결했으나 만족은 못했다...
for문을 돌려, 하나씩 더하거나 빼주는 방법은 생각했으나,
효율성이나 시간을 생각하다 보니 복잡하게 구성하려 한것이 도리어 문제였고, 그마저도 해결 못하고 더럽게 짰다.

	`list` 를 따로 만들어 케이스를 두는 형태의 코딩은 생각 못했으나, 
	시간적인 부분이나 효율이나.. 
	이제부터 그렇게 짜려고 노력해봐야 할듯... 

우선 나는

n = int(input())   
A  = input().split()

x,  y = 1, 1
for i in A:
  if y != n and i == 'R':
      y += 1
  elif y != 1 and i == 'L':
      y -= 1
  elif x!= 1 and i == 'U':
      x -= 1
  elif x != n and i == 'D':
      x += 1

print(x, y)

더럽게 짬. 당연함. 블로그 주인은 감자임.
Python에는 시간을 측정할 수 있는 time이라는 함수가 있는데,
예시를 돌리는 경우 0.00100 sec이 나왔다.

ex)

import time
start = time.time() //시작할 위치에 두기
end = time.time() // 끝나는 위치
print(f"{end - start:.5f} sec") 

만약에 더 보고 싶다면, .5의 값을 늘려주면 된다.

다른 방법으로는 앞서 말한대로
list를 이용해서, 케이스를 만들어준 방식이다.

n = int(input())   
A  = input().split()

x,  y = 1, 1
move_x = [0, 0, -1, 1]
move_y = [-1, 1, 0, 0]

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

for i in A:
  for j in range(len(move_type)):
      if i == move_type[j]:
          nx = x + move_x[j]
          ny = y + move_y[j]
          
  if nx < 1 or ny < 1 or nx > n or ny > n:
      continue
      
  x, y = nx, ny

print(x, y)
	move_x 와 move_y를 따로 만들어둔 이유는, x와 y를 1값으로 따로 따로 
	받았기 때문에, x와 y 연산을 if문 한번에 작동이 되는 효율성을 만들기 위해서는
	따로 list를 만들어야 하기 때문이다.

그 후 앞서 내가 한 방식처럼, 자연스러운 꼽사리 끼기
if문을 이용해서 n이 공간을 벗어나는 케이스는 continue 시키면 된다.


반성의 시간

	예전에는 푸는 것에 의의를 뒀는데, 이제는 효율성이나 시간을 생각해서
	다양한 방법으로 접근 하는것에 목적을 둬야 겠다... 짧고 간단한것에
	고집하지 말기...😕


	그나저나 사담으로 코딩 하면서 코딩 노동요를 듣는데 LUCY를 추천드립니다. 
	최고의 밴드 그리고 아무도 이 블로그에 오지 않았다.
profile
트러블 슈팅 Blog => https://polla.palms.blog/home

0개의 댓글