문제 url: https://school.programmers.co.kr/learn/courses/30/lessons/49190
난이도: Lv.5
정답률:
권장 시간: 분
권장 시간 복잡도:
문제 설명
원점(0,0)에서 시작해서 아래처럼 숫자가 적힌 방향으로 이동하며 선을 긋습니다.
ex) 1일때는 오른쪽 위
로 이동
그림을 그릴 때, 사방이 막히면 방하나로 샙니다.
이동하는 방향이 담긴 배열 arrows가 매개변수로 주어질 때, 방의 갯수를 return 하도록 solution 함수를 작성하세요.
제한사항
- 배열 arrows의 크기는 1 이상 100,000 이하 입니다.
- arrows의 원소는 0 이상 7 이하 입니다.
- 방은 다른 방으로 둘러 싸여질 수 있습니다.
입출력 예
arrows | return |
---|---|
[6, 6, 6, 4, 4, 4, 2, 2, 2, 0, 0, 0, 1, 6, 5, 5, 3, 6, 0] | 3 |
입출력 예 설명
- (0,0) 부터 시작해서 6(왼쪽) 으로 3번 이동합니다. 그 이후 주어진 arrows 를 따라 그립니다.
- 삼각형 (1), 큰 사각형(1), 평행사변형(1) = 3
내 풀이
def solution(arrows):
answer = 0
# 방향 설정 (8방향)
dx = [0, 1, 1, 1, 0, -1, -1, -1]
dy = [1, 1, 0, -1, -1, -1, 0, 1]
# 방문한 노드와 간선 저장
visited_nodes = set()
visited_edges = set()
# 시작점
x, y = 0, 0
visited_nodes.add((x, y))
for arrow in arrows:
for _ in range(2): # 중간 노드도 체크
nx, ny = x + dx[arrow], y + dy[arrow]
# 노드 방문 확인
if (nx, ny) in visited_nodes:
# 간선 방문 여부 확인
if (x, y, nx, ny) not in visited_edges:
answer += 1
else:
visited_nodes.add((nx, ny))
# 간선 방문 처리
visited_edges.add((x, y, nx, ny))
visited_edges.add((nx, ny, x, y))
# 현재 위치 갱신
x, y = nx, ny
return answer