Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 2019 KAKAO BLIND RECRUITMENT
- 투포인터
- 백준
- 조합
- 플로이드와샬
- 투 포인터
- 크루스칼
- 트라이
- SWEA
- 2021 KAKAO BLIND RECRUITMENT
- GIT
- BFS
- 스택
- 이분탐색
- 파이썬
- 플로이드 와샬
- 구현
- 다익스트라
- 로봇 청소기
- 2020 카카오 인턴십
- 우선순위큐
- 프로그래머스
- 브루트포스
- 시뮬레이션
- 백트래킹
- 2018 KAKAO BLIND RECRUITMENT
- 최소 신장 트리
- 2020 KAKAO BLIND RECRUITMENT
- 비트마스킹
- Spring
Archives
- Today
- Total
개발조아
[프로그래머스] 길 찾기 게임 파이썬 본문
728x90
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42892
문제는 간단하다.
좌표를 주고 이를 이진트리로 구성해서 전위,후위 탐색을 수행한 결과 값을 내놔라 이다.
트리 구성은 재귀로 구현했다.
우선 좌표를 정렬했다. y는 작아지게 x좌표는 커지게 정렬하게 되면 부모 노드부터 순서대로 정렬이 된다.
그리고 가장 첫번째 값이 부모노드가 된다.
이제 부모노드를 트리에 넣고 시작한다.
왼쪽은 자신보다 y 좌표가 작은 노드가 오른쪽은 자신보다 y좌표가 큰 노드가 들어가게 문제에서 트리를 구성하라고 한다.
그래서 조건에 방향에 자식 노드가 있다면 그 자식으로 들어가서 다시 조건을 체크한다.
하지만 없다면 그 자리에 넣으려는 정보 가지고 노드를 생성해서 넣어주면 된다.
전위 탐색은 부모,왼쪽,오른쪽 순으로 탐색하는 것이고
후위 탐색은 왼쪽,오른쪽,부모 순으로 탐색하는 방식이다.
이는 재귀로 간단하게 구현할 수 있다.
그리고 노드가 최대 1만개가 주어진다. 만약 트리가 한쪽 방향으로만 쭉 이어진 편향이진트리일 경우 최대 재귀가 1만번 돌게 된다. 파이썬은 기본 1000만 돌도록 되어 있기 때문에 이를 setrecursionlimit로 늘려줘야한다.
늘리지않는다면 테케 6,7번인가 런타임 에러가 날 것이다.
from sys import setrecursionlimit
setrecursionlimit(10000)
class Node(object):
def __init__(self, info):
self.num = info[2]
self.pos = info[:2]
self.left = None
self.right = None
def solution(nodeinfo):
answer = [[]]
for idx in range(len(nodeinfo)):
nodeinfo[idx].append(idx+1)
nodeinfo.sort(key=lambda x :(-x[1],x[0]))
tree = Node(nodeinfo[0])
for info in nodeinfo[1:]:
add_node(tree,info)
return [pre_order(tree),post_order(tree)]
def pre_order(curr):
path = [curr.num]
if curr.left:
path += pre_order(curr.left)
if curr.right:
path += pre_order(curr.right)
return path
def post_order(curr):
path = []
if curr.left:
path += post_order(curr.left)
if curr.right:
path += post_order(curr.right)
path.append(curr.num)
return path
def add_node(parent,info):
if parent.pos[0] > info[0]:
if parent.left:
add_node(parent.left,info)
else:
parent.left = Node(info)
else:
if parent.right:
add_node(parent.right,info)
else:
parent.right = Node(info)
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 빛의 경로 사이클 파이썬 (0) | 2021.10.01 |
---|---|
[프로그래머스] 표 편집 파이썬 (0) | 2021.10.01 |
[프로그래머스] 블록 이동하기 파이썬 (0) | 2021.09.04 |
[프로그래머스] 외벽 점검 파이썬 (0) | 2021.09.03 |
[프로그래머스] 가사 검색 파이썬 (0) | 2021.09.02 |
Comments