파이썬 좌표 문제 쉽게 해결하는 방법
파이썬 좌표 구현 문제 쉽게 해결하는 방법
알고리즘 문제 중에서 구현 문제로 좌표를 사용하는 문제가 자주 출제되는데,
좌표를 어떻게 받고, 이동하는 방법을 잘 외워두면 문제를 쉽게 해결할 수 있습니다.
파이썬 공백으로 구분되는 입력 받기
우선 문제를 풀려면 공백으로 입력되는 값을 잘 읽을 수 있어야 합니다.
C언어라면 scanf()를 사용하여 받았겠지만, 파이썬에서는 input()을 이용하여 입력값을 받습니다.
input().split()을 사용하면 공백을 기준으로 나누어서 저장할 수 있습니다.
map(int, input().split())을 사용하는데, 공백을 기준으로 나눈 값을 int로 취급하겠다는 의미입니다.
#입력값
#4 4
n, m = map(int, input().split())
#n=4, m=4
파이썬 알파벳 숫자로 변환
왕실의 나이트 문제에서 위치를 입력받을 때, 알파벳과 숫자를 모두 받습니다.
그래서 알파벳을 숫자로 변환하여 위치를 계산하면 연산이 쉽습니다.
ord()를 사용하면 알파벳을 숫자로 변환해주어 숫자로 계산할 수 있습니다.
input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) +1
상하좌우 풀이
#상하좌우
#n을 입력받기
n= int(input())
#그냥 input().split()으로 받기 가능
plan = list(input().split())
# x,y = 1,1로 간단한 초기화 가능
ans_x=1
ans_y=1
#L, R, U , D에 따른 이동 방향
#dx =[0,0,-1,1] dy=[-1,1,0,0]
#move_types=['L','R','U','D']
for i in plan:
if i == 'R':
if ans_y < n:
ans_y +=1
elif i =='L':
if ans_y >1:
ans_y -=1
elif i=='U':
if ans_x >1:
ans_x -=1
elif i=='D':
if ans_x <n:
ans_x+=1
#이동 계획을 하나씩 확인
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(str(ans_x)+' '+str(ans_y))
왕실의 나이트 풀이
저는 dx, dy를 사용하여 풀었는데, step을 튜플로 설정하여 문제를 풀 수 있습니다.
steps =[(-2, -1), (-1, -2), (1, -2), (2,-1), (2, 1), (1, 2), (-1, 2), (-2,1) ]
변수명에 nx, ny라고 표시한 이유는 next_x, next_y값을 의미하기 때문입니다.
이동 범위를 한 변수 안에 담으면 활용하기 더욱 편합니다.
#왕실의 나이트
#첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자가 입력된다.
#첫째 줄에 나이트가 이동할 수 있는 경위의 수를 출력하시오
#좌표 받기
night=input()
dx=[1,1,-1,-1,2,2,-2,-2]
dy=[2,-2,2,-2,1,-1,1,-1]
night_x=int(ord(night[0]) -ord('a')+1)
night_y=int(night[1])
#탐색하기
ans=0
for i in range(len(dx)):
nx=night_x+dx[i]
ny=night_y+dy[i]
if nx <1 or ny <1 or nx >8 or ny >8:
continue
else:
ans +=1
print(ans)
게임 개발 문제는 시간이 없어서 주말에 풀 예정입니다.
DFS, BFS
자류구조
데이터를 표현하고 관리하고 처리하기 위한 구조를 의미합니다.
오버플로
수용할 수 있는 데이터의 크기로 이미 가득 찬 상태에서 삽입 연산을 수행할 때 발생합니다.
언더플로
자료구조에 데이터가 전혀 들어 있지 않은 상태에서 삭제 연산을 수행할 때 발생합니다.
스택
스택은 박스 쌓기에 비유할 수 있으며, 선입후출, 후입선출 구조를 가지고 있습니다.
파이썬에서는 기본 리스트에서 append()와 pop() 메서드를 이용하면 스택 자료구조와 동일합니다.
stack = []
stack.append(5)
stack.pop()
큐
큐는 대기 줄에 비유할 수 있으며, 선입선출 구조를 가지고 있습니다.
파이썬에서 큐를 구현할 때는 collections 모듈에서 제공하는 deque 자료구조를 이용하면 됩니다.
deque 객체를 리스트 자료형으로 변경하고 싶다면 list(queue)를 하면 됩니다.
from collections import deque
queue = deque()
queue.append(5)
queue.popleft()
재귀 함수
재귀함수는 자기 자신을 다시 호출하는 함수를 의미합니다.
아래 코드를 실행하면 'this is recursive function'문장이 끊임 없이 출력됩니다.
def recursive_function():
print('this is recursive function')
recursive_function()
recursive_function()
재귀 함수 안에 종료 조건을 명시하지 않으면 오류가 발생하기 때문에, 종료 조건을 꼭 명시해야 합니다.
return을 적어주어 종료 조건을 나타낼 수 있습니다. if 문을 사용하여 종료 조건을 써주었습니다.
def factorial_recursive(n):
if n<=1:
return 1
return n * factorial_recursive(n-1)
공부 마무리
오늘은 퇴근하고 병원에 갔다 오느라 1시간 반 정도 공부할 수 있었습니다.
할당량을 채우지 못하고 진도를 못 따라갈 줄 알았는데, 읽다 보니 진도를 따라잡아서 너무 뿌듯합니다 :)
오늘 공부에서는 c언어 문제 풀 때 사용했던 nx, ny 사용법과 재귀함수 사용 방법, 그리고 Queue를 사용할 땐 collections의 deque를 사용하면 된다는 점을 배웠습니다.
'컴퓨터 IT > Python' 카테고리의 다른 글
파이썬 이진 탐색 다양한 예제 코드 (0) | 2022.09.28 |
---|---|
파이썬 좌표 문제 입력 받는 방법(DFS, BFS) 퀵소트 코드 (0) | 2022.09.27 |
이것이 취업을 위한 코딩 테스트다 파이썬 후기 (0) | 2022.09.19 |
코딩 테스트 준비: 파이썬 알고리즘 인터뷰 후기 (1) (0) | 2022.08.09 |
matplotlib, plt scatter 완벽 정리: 파이썬 머신러닝 판다스 데이터 분석(3) (0) | 2022.08.06 |
댓글
이 글 공유하기
다른 글
-
파이썬 이진 탐색 다양한 예제 코드
파이썬 이진 탐색 다양한 예제 코드
2022.09.28 -
파이썬 좌표 문제 입력 받는 방법(DFS, BFS) 퀵소트 코드
파이썬 좌표 문제 입력 받는 방법(DFS, BFS) 퀵소트 코드
2022.09.27 -
이것이 취업을 위한 코딩 테스트다 파이썬 후기
이것이 취업을 위한 코딩 테스트다 파이썬 후기
2022.09.19 -
코딩 테스트 준비: 파이썬 알고리즘 인터뷰 후기 (1)
코딩 테스트 준비: 파이썬 알고리즘 인터뷰 후기 (1)
2022.08.09