반응형

파이썬 좌표 구현 문제 쉽게 해결하는 방법 

알고리즘 문제 중에서 구현 문제로 좌표를 사용하는 문제가 자주 출제되는데, 

좌표를 어떻게 받고, 이동하는 방법을 잘 외워두면 문제를 쉽게 해결할 수 있습니다. 

python

파이썬 공백으로 구분되는 입력 받기

우선 문제를 풀려면 공백으로 입력되는 값을 잘 읽을 수 있어야 합니다. 

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를 사용하면 된다는 점을 배웠습니다. 

반응형