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 |
Tags
- 스택
- 2019 KAKAO BLIND RECRUITMENT
- 플로이드 와샬
- 로봇 청소기
- 트라이
- 2020 KAKAO BLIND RECRUITMENT
- 플로이드와샬
- 2020 카카오 인턴십
- SWEA
- 투 포인터
- 최소 신장 트리
- 2018 KAKAO BLIND RECRUITMENT
- Spring
- 시뮬레이션
- 이분탐색
- GIT
- 백트래킹
- BFS
- 파이썬
- 크루스칼
- 조합
- 비트마스킹
- 백준
- 브루트포스
- 우선순위큐
- 다익스트라
- 구현
- 2021 KAKAO BLIND RECRUITMENT
- 투포인터
- 프로그래머스
Archives
- Today
- Total
개발조아
[BOJ/백준] 11067 모노톤길 파이썬 본문
728x90
문제링크 : https://www.acmicpc.net/problem/11067
길의 좌표를 줬을 때 잘 나열해놓고 원하는 카페 번호를 출력하면 된다.
일단 입력받은 x,y좌표를 오름차순으로 일단 정렬했다. 이는 길이 오른쪽부터 왼쪽으로 향하기 때문이다.
그리고 x좌표에 대해서 똑같은 값을 가진 점들의 개수를 세서 저장했다.
y좌표는 일단 오름차순으로 정렬되어 있다. 하지만 카페의 길이 현재 점에서 위로 갈수도 있고 아래로 갈수도 있다.
그리고 길은 수평, 수직방향으로만 연결이 가능한데 오름차순으로 정렬되어 있을 경우 만들지 못하는 경우가 있다.
그때 사용하기 위해 개수를 세서 저장했다.
그리고 시작 점은 무조건 0,0에서 시작한다.
그렇기에 첫점이 0,0이 아니라면 수정해줘야한다.
그리고 이후 점들에서도 현재 점좌표랑 이전좌표가 x값도 y도 다른 경우 이는 정렬이 잘못되어 있는 경우이다. 이경우도 수정해줘야한다.
아래 처럼 길이 있다고 해보자
0 1
2
3
길은 오름차순으로 정렬되어 있기 때문에 길의 순서는 0 3 2 1 순으로 되어 있을 것이다. 하지만 실제 길은 0 1 2 3으로 되어 있다. 이런 경우를 체크해서 수정해줘야한다. 이는 첫점에서도 해당된다.
순서를 바꾸는 건 미리 저장한 x개수를 활용한다.
현재 점에서 x개수 만큼의 좌표의 순서를 뒤집어서 원본을 수정하면 된다.
from sys import stdin
input = stdin.readline
tc = int(input())
def solv():
n = int(input())
points = []
xcnt = [0] * 100001
for _ in range(n):
x,y = map(int, input().split())
points.append((x,y))
xcnt[x] += 1
points.sort()
idx = 0
if points[0][0] != 0 or points[0][1] != 0:
idx = modify_order(points, idx, xcnt)
else:
idx = 1
while idx < n:
if points[idx-1][0] != points[idx][0] and points[idx-1][1] != points[idx][1]:
idx = modify_order(points, idx, xcnt)
else:
idx += 1
targets = list(map(int, input().split()))
for target in targets[1:]:
print(*points[target-1])
def modify_order(points, idx, xcnt):
tmp = points[idx:idx + xcnt[points[idx][0]]]
op = -1
start = xcnt[points[idx][0]] - 1
end = -1
for j in range(start, end, op):
points[idx] = tmp[j]
idx += 1
return idx
for _ in range(tc):
solv()
내 풀이는 굉장히 느렸다. 좀 최적화가 필요할듯 하다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 18119 단어 암기 파이썬 (0) | 2021.09.12 |
---|---|
[BOJ/백준] 6987 월드컵 파이썬 (0) | 2021.09.12 |
[BOJ/백준] 8982 수족관 1 파이썬 (0) | 2021.09.10 |
[BOJ/백준] 15686 치킨 배달 파이썬 (0) | 2021.09.09 |
[BOJ/백준] 14503 로봇 청소기 파이썬 (0) | 2021.09.09 |
Comments