일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 2019 KAKAO BLIND RECRUITMENT
- 우선순위큐
- 2020 카카오 인턴십
- 백준
- Spring
- 2020 KAKAO BLIND RECRUITMENT
- SWEA
- 브루트포스
- 조합
- 투 포인터
- 2021 KAKAO BLIND RECRUITMENT
- 트라이
- 백트래킹
- BFS
- 스택
- 시뮬레이션
- 비트마스킹
- 이분탐색
- 최소 신장 트리
- 플로이드 와샬
- 로봇 청소기
- GIT
- 2018 KAKAO BLIND RECRUITMENT
- 크루스칼
- 파이썬
- 투포인터
- 구현
- 프로그래머스
- 다익스트라
- 플로이드와샬
- Today
- Total
개발조아
[프로그래머스] 길 찾기 게임 파이썬 본문
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42892
코딩테스트 연습 - 길 찾기 게임
[[5,3],[11,5],[13,3],[3,5],[6,1],[1,3],[8,6],[7,2],[2,2]] [[7,4,6,9,1,8,5,2,3],[9,6,5,8,1,4,3,2,7]]
programmers.co.kr
문제는 간단하다.
좌표를 주고 이를 이진트리로 구성해서 전위,후위 탐색을 수행한 결과 값을 내놔라 이다.
트리 구성은 재귀로 구현했다.
우선 좌표를 정렬했다. 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 |