BOJ - 4181 - Convex Hull

Updated:

import sys

def getDegree(p1, p2):
    return p2[0] - p1[0], p2[1] - p1[1]

def ccw(p1, p2, p3):
    v, u = getDegree(p1, p2), getDegree(p1, p3)
    if v[0] * u[1] >= v[1] * u[0]: return True
    else: return False

def convex_hull(position):
    convex = []
    for p3 in position:
        while len(convex) >= 2:
            p1, p2 = convex[-2], convex[-1]
            if ccw(p1, p2, p3):
                break
            convex.pop()
        convex.append(p3)
    return convex

def solution():
    N = int(input())
    ret = 0
    position = []
    for _ in range(N):
        x, y, ch = map(str, sys.stdin.readline().split())
        if ch == 'Y':
            position.append((int(x), int(y)))

    position = sorted(position, key=lambda x:(x[0], x[1]))
    ccwtemp = convex_hull(position)

    position.reverse()
    temp = convex_hull(position)

    for i in range(1, len(temp)-1):
        ccwtemp.append(temp[i])

    print(len(ccwtemp))
    for x, y in ccwtemp:
        print(x, y)

solution()

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

Categories:

Updated:

Leave a comment