PS/백준

[Problem Solving] 기하1 백준 예제/Python

미강 2022. 7. 27. 16:40

해당 게시글은 비전공자이자 쌩초보 개발자 지망생이 작성한 글로 정확하지 않을 수 있으니 참고해주시길 바랍니다! 

피드백과 정보 정정 댓글은 환영입니다 :)

 

도형을 활용하여 푸는 문제였던 기하1 ! 유독 원을 활용하여 푸는 문제가 많았던 것 같다. 그래서인지 고등학교 수학(상)에 나온 개념들을 활용하여 충분히 풀 수 있었다. 또한, 개인적으로 시간 초과에서 자유로운 문제들이라는 생각이 들었다 ㅎㅎ 

 

# 백준 2477번 참외밭 Python3

import sys

K = int(sys.stdin.readline())

east_west_len = []
south_north_len = []
length = []

for i in range(6):
    direction, lengths = map(int, sys.stdin.readline().split())

    if direction == 1 or direction == 2:
        east_west_len.append(lengths)
    else:
        south_north_len.append(lengths)

    length.append(lengths)

rect = max(east_west_len) * max(south_north_len)

index1 = length.index(max(east_west_len))
index2 = length.index(max(south_north_len))

smaller = length[(index1+3)%6]*length[(index2+3)%6]

print((rect-smaller)*K)

# 백준 2477번 참외밭 Python3

전체 직사각형에서 작은 직사각형의 크기를 빼줘야 하는 문제였다. 이 문제의 핵심은 전체 직사각형의 가로 세로 길이의 인덱스에 +3을 하면 빼야 하는 작은 직사각형의 가로 세로 길이가 위치해 있다는 것! 만약 +3 한 인덱스가 범위를 벗어나면 이를 6으로 나눈 나머지로 인덱스를 재설정해주면 된다.

 

# 백준 1002번 터렛 Python 3

import sys

T = int(sys.stdin.readline())

for i in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())

    d = ((x1-x2)**2 + (y1-y2)**2)**(1/2)

    if d == 0 and r1==r2: # 교점이 무수히 많을 경우, 두 원 동일
        print(-1)

    elif d>r1+r2: 
        print(0)
        
    elif d==r1+r2:
        print(1)
        
    elif d < r1+r2 and d>max(r1, r2) - min(r1,r2):
        print(2)

    elif d == max(r1, r2) - min(r1,r2):
        print(1)
        
    else:
        print(0)

# 백준 1002번 터렛 Python 3

이 문제는 고등학교 때 배운 두 원의 위치관계를 반지름과 중심 사이의 길이로 파악하는 방법을 활용하면 된다. 자세한 내용은 https://mathbang.net/101 이 링크를 첨부하도록 하겠다! 이에 더하여 교점이 무수히 많을 경우 (두 원이 동일한 경우) 일 때 -1을 출력하게끔 코드를 작성하였다.

 

# 백준 1004번 어린왕자 Python 3

import sys

T = int(sys.stdin.readline())

for i in range(T):
    result = 0
    x1, y1, x2, y2 = map(int, sys.stdin.readline().split())
    n = int(sys.stdin.readline())
    
    for j in range(n):
        cx, cy, r = map(int, sys.stdin.readline().split())

        if (x1-cx)**2 + (y1-cy)**2 < r**2 and (x2-cx)**2 + (y2-cy)**2 > r**2: 
            result += 1

        if (x1-cx)**2 + (y1-cy)**2 > r**2 and (x2-cx)**2 + (y2-cy)**2 < r**2: 
            result += 1
            
    print(result)

# 백준 1004번 어린왕자 Python 3

해당 문제는 출발점과 도착점이 몇 개의 행성계에 포함되는지를 세주면 되는 문제이다. 따라서 행성계의 중심, 반지름이 들어올 때마다 해당 행성계에 출발점과 도착점이 포함되어 있는지, 원의 방정식을 작성하여 체크해줬다. 다만, 같은 행성계에 출발점과 도착점이 동시에 포함되어 있다면 이때는 굳이 행성계를 통과하지 않아도 되므로 if 조건을 위와 같이 작성해주었다.

 

# 백준 1358 하키 Python 3

import sys

W, H, X, Y, P = map(int, sys.stdin.readline().split())
result = 0
r1 = X #왼쪽 원 중심의 x좌표
r2 = (2*Y + H) * 0.5 #왼쪽 원 중심의 y좌표
r3 = X+W #오른쪽 원 중심의 x좌표
r4 = (2*Y + H) * 0.5 #오른쪽 원 중심의 y좌표
rad = abs(H)*(0.5) #원의 반지름

for i in range(P):
    x1, y1 = map(int, sys.stdin.readline().split())

    if X <= x1 and x1 <= X+W: 
        if Y <= y1 <= Y+H:
            result += 1  # 좌표가 직사각형에 포함되어 있을 때     
            
    else: 
        if x1<X: 
            if (x1-r1)**2 + (y1-r2)**2 <= rad**2:
                result += 1 # 좌표가 왼쪽 원에 포함되어 있을 때

        else:
            if (x1-r3)**2 + (y1-r4)**2 <= rad**2:
                result += 1 # 좌표가 오른쪽 원에 포함되어 있을 때

print(result)

# 백준 1358 하키 Python 3

이 문제도 좌표 설정 잘해주고 좌표가 어떤 영역에 포함될 수 있는지 3가지 경우를 나누어 생각해주면 된다. 직사각형, 왼쪽 반원, 오른쪽 반원, 총 3가지 경우로 나누어 주면 된다! 또한, 문제에서 경계에 포함되는 경우도 세줘야 하기 때문에 부등호에 = 을 달아주었다.

 

느낀점

수학과외를 꾸준히 하고 있다는 사실이 다행이라고 느껴졌다! 생각보다 원방이 많이 쓰이는군.