본문 바로가기
알고리즘/BOJ

[Python] 백준 17619번: 개구리 점프

by PIAI 2021. 9. 14.

https://www.acmicpc.net/problem/17619

 

17619번: 개구리 점프

첫 번째 줄에 통나무 개수 N과 질문의 개수 Q가 주어진다. 다음 N개의 줄에 각 통나무에 x1, x2, y의 세 정수 좌표가 주어진다. 주어진 통나무는 두 점 (x1, y)와 (x2, y)를 잇는 형태이다. (x1 < x2) 모든

www.acmicpc.net

 

1. 통나무의 높이는 크게 상관이없다. 통나무끼리의 길이만 겹쳐있으면 어디로든지 이동할수있다.

2. 처음에 x길이를 기준으로 정렬을 해준다.

3. union & find로 길이가 겹치면 이전노드로 현재노드를 묶어주고 ny길이값을 갱신해준다(처음에 정렬했기때문에 x값은 고정).

4. 길이가 겹치지않으면 nx, ny 값을 다음 x, y 값으로 초기화해준다.

5. 입력을 N 100,000개 Q 100,000개이므로 기존input()으로 입력을 받으면 시간초과가 난다.

(참고)

https://www.acmicpc.net/blog/view/57

 

출력 속도 비교

여러가지 언어와 출력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 총 N개의 줄에 1부터 10,000,000까지의 자연수를 한 줄에 하나씩 출력하는 시간을 측정. 10번 측정해서 평

www.acmicpc.net

import sys
n, m = map(int, input().split())
log = [[-1, -1, 0]]
parent = [i for i in range(n+1)]

def find(x):
    if x == parent[x]:
        return x
    else:
        parent[x] = find(parent[x])
        return parent[x]

def union(x, y):
    x = find(x)
    y = find(y)
    if x < y:
        parent[y] = x
    else:
        parent[x] = y

for i in range(n):
    s, e, h = map(int, sys.stdin.readline().rstrip().split())
    log.append([s, e, i+1])

log.sort(key=lambda x: (x[0], x[1]))
x, y, _ = log[1]
for i in range(2, len(log)):
    nx, ny, _ = log[i]
    if nx <= y:
        union(log[i-1][2], log[i][2])
        y = max(y, ny)
    else:
        x, y = nx, ny

for _ in range(m):
    s, e = map(int, sys.stdin.readline().rstrip().split())
    if find(s) == find(e):
        print(1)
    else:
        print(0)

 

 

댓글