728x90
구현 문제로 특별한 알고리즘 기법에 대한 사전 지식 없이 풀 수 있는 문제입니다. 문제 설명란 외의 입력란에 있는 조건들도 보면서 풀어주시면 됩니다.
소스 코드
import sys
from collections import deque
input = sys.stdin.readline
n = int(input())
k = int(input())
dx = [0,1,0,-1]
dy = [1,0,-1,0]
board = [[0]*(n+1) for _ in range(n+1)]
q = deque()
for _ in range(k):
x,y = map(int,input().split())
board[x][y] = 1
l = int(input())
for _ in range(l):
x,c = input().split()
x = int(x)
q.append([x,c])
cnt = 0
d = 0
mx = 1
my = 1
board[mx][my] = 2
t = q.popleft()
bam = [[mx,my]]
while True:
nx = mx + dx[d]
ny = my + dy[d]
if 1<=nx<=n and 1 <=ny<=n and board[nx][ny] != 2:
if board[nx][ny] == 0:
tx,ty = bam.pop(0)
board[tx][ty] = 0
board[nx][ny] = 2
bam.append([nx,ny])
else:
cnt+=1
break
mx, my = nx, ny
cnt += 1
if cnt in t:
if t[1] == 'D':
d += 1
elif t[1] == 'L':
d -=1
d %= 4
if q:
t = q.popleft()
print(cnt)
저는 이렇게 풀었는데 정말... 코드를 어떻게 해야 깔끔해질까요?? while문 전까지가 전부 초기화 및 세팅과 관련한 작업이네요. 허허허. 함수로 분리를 해봤으나 어떤 쪽이 더 깔끔한지 감이 오지 않아서 일단 합쳐놓은 코드만 포스팅하겠습니다.
별 내용이 없네요. 기존 맵 탐색하는 문제들에 방향 전환 조건 + 뱀 자기 자신에게 부딪히는 조건만 추가되었습니다. bam도 (뱀 머리부터 꼬리까지의 위치가 담긴 list) deque로 구현해봤었는데요.(pop(0)의 경우 배열 끝에서 마지막까지 탐색하는 과정을 거치기에 시간 낭비라고 생각해서 deque로 구현하려고 함) [x, y]의 2차원 배열 형태로 넣었다고 생각했지만 popleft()를 하면 x값만 반환돼서 일반적인 형태로 풀었습니다.
참고로 왼쪽,오른쪽 방향 전환에서 d+=1 , d-=1 하고 공통적으로 4로 mod 연산을 해주고 있습니다. d가 방향 배열의 인덱스 범위를 넘어가지 않게 조정해주는 작업입니다. 예전에는 다 if문으로 컨트롤하다가 처음 써봤는데 이쪽이 depth가 깊지 않아서 그런가 깔끔해 보입니다.
728x90
'알고리즘 > ps' 카테고리의 다른 글
[python] 수식 최대화 - 프로그래머스 (0) | 2021.05.05 |
---|---|
[python] 2021 KAKAO BLIND RECRUITMENT 신규 아이디 추천 (0) | 2021.05.04 |
[파이썬] 백준 바이러스 2606번 (0) | 2021.03.17 |
[파이썬] 백준 20115 에너지 드링크 (1) | 2021.03.06 |
[python] 백준 10799 쇠막대기 (0) | 2021.02.04 |