목록Algorithm (111)
Sunrise
정수론 및 조합론 문제입니다. N개의 링 반지름을 받습니다. 기약분수 형태로 출력해야 하므로, 첫번째 반지름과 그 이후 반지름들의 최대공약수 g를 구합니다. 각 반지름들에 대하여 g로 나눠준 값을 출력합니다. 형식에 맞게 출력하기 위해 파이썬 f-string을 이용하여 출력합니다. import math import sys input = sys.stdin.readline N = int(input()) rings = list(map(int, input().split())) for i in range(1, len(rings)): g = math.gcd(rings[0], rings[i]) print(f"{rings[0]//g}/{rings[i]//g}")
정수론 및 조합론 문제입니다. N개의 숫자들을 받습니다. (N은 2이상 100이하, 숫자는 10억이하 자연수) 숫자들을 어떤 수로 나누었을 때, 모든 나머지가 같게되는 수를 구해야합니다. N[0] = K[0] * X + R N[1] = K[1] * X + R N[2] = K[2] * X + R 이런 식이 되므로 N[i+1] - N[i] 들은 (K[i+1] - K[i]) * X , 즉 모두 X를 머금은 X의 배수 상태가 됩니다. 즉, N[i+1] - N[i] 의 최대공약수를 구하고 그 수의 약수들을 구하면 나머지가 같게 되는 수를 구할 수 있습니다. 1. 최대공약수 구하기 arr에 일단 숫자들을 모두 받습니다. 0 ~ len(arr) - 1까지 범위에서, i는 0 일때 gcd를 초기화하고 그 이후부터 gc..
기하 문제입니다. 문제에서 주어진 W, H, X, Y, P 를 받습니다. 이후 P번만큼 선수들의 위치 px, py를 받았을 때, (px, py) 가 왼쪽 반원 / 가운데 사각형 / 오른쪽 반원에 위치하는지 식을 구하여 확인합니다. if - elif - elif 문으로 모두 경계선 포함으로 해도 상관 없습니다. import sys input = sys.stdin.readline W, H, X, Y, P = map(int, input().split()) R = H//2 cnt = 0 for _ in range(P): px, py = map(int, input().split()) if ((px - X)**2 + (py - (Y+R))**2
기하 문제입니다. 출발점 좌표와 도착점 좌표를 받고, n개의 행성계 위치와 반지름을 받습니다. 출발점에서 도착점으로 이동할 때, 행성계를 진입하거나 이탈을 하는지 확인하기 위해서는 원의 방정식 영역 안에 들어있는지 확인하면 됩니다. (x² + y² < r²) 다만, 출발점과 도착점이 둘 다 원에 속하거나, 둘 다 속하지 않을 경우에는 진입/이탈 필요가 없으므로 출발점과 도착점 중 하나만 원에 속하는 경우만 cnt 증가시킵니다. ''' x1 y1 x2 y2 n cx cy r ''' T = int(input()) for test_case in range(T): x1, y1, x2, y2 = map(int, input().split()) n = int(input()) cnt = 0 for _ in range(..
기하 문제입니다. 좌표1, 반지름1, 좌표2, 반지름2를 다 받습니다. 좌표1 과 좌표2 가 같을 때, 반지름까지 같은지 확인하여 교점이 무한대인지, 0 개인지 확인합니다. 좌표1 과 좌표2 가 다를 때, math 모듈 dist 메소드를 이용하여 좌표 사이의 거리 d를 구합니다 d를 기준으로, r1 + r2 보다 크지 않고, r1 - r2 또는 r2 - r1 보다 큰 경우 교점이 2개입니다. r1 + r2 와 같으면 외접, r1 - r2 또는 r2 - r1 과 같으면 내접 그 외에는 만나는 경우가 없으므로 교점 0 개 import math T = int(input()) for _ in range(T): x1, y1, r1, x2, y2, r2 = map(int, input().split()) if x1 ..
기하 문제입니다. 문제에 따르면 유클리드 원넓이 = π * r * r , 택시 원넓이 = 2 * r * r π 가 필요하므로 math 모듈 사용하고 자릿수 6자리 지정해야 하므로 format 프린트 사용합니다. import math R = int(input()) e = math.pi * R * R t = 2 * R * R print(f'{e:.6f}') print(f'{t:.6f}')
기하 문제입니다. 참외밭의 모양이 육각형이므로 큰 사각형 넓이 - 작은 사각형 넓이로 접근합니다. 1. 큰 사각형 넓이 주어지는 입력에서 긴 가로변, 긴 세로변을 구해서 큰 사각형 넓이를 구할 수 있습니다. 2. 작은 사각형 넓이 작은 사각형 넓이를 구하기 위해서는 긴 가로변에 붙어있는 세로변들의 차이, 긴 세로변에 붙어있는 가로변들의 차이를 구해야 합니다. 이를 위해서 긴 가로변, 긴 세로변을 구할 때 인덱스를 구해놓고, 인덱스의 +1 -1 에 해당하는 변들의 차이를 구해서 작은 사각형의 가로변, 세로변을 구합니다. (큰 사각형 넓이 - 작은 사각형 넓이) * 참외 개수 K 로 답을 구할 수 있습니다. ''' 육각형이니까 큰 사각형 - 작은 사각형 긴 가로변, 긴 세로변 구해서 큰 사각형 넓이 구하기 ..
기하 문제입니다. 한수의 위치 (x, y), 직사각형의 가로, 세로 길이 w, h를 받습니다. 한수의 위치에서 직사각형 경계선까지 가는 거리는 총 4가지 (w - x, h - y, x, y ) 입니다. 이 중의 최솟값을 구하면 됩니다. x, y, w, h = map(int, input().split()) answer = min(abs(x-w), abs(y-h), x, y) print(answer)
집합과 맵 문제입니다. 문자열 S를 입력받은 후, 연속되는 문자열의 가능한 경우를 일단 모두 구한 후, 중복되는지 확인해봐야 합니다. 예시로 ababc 인 경우, 가능한 모든 경우는 총 20개가 나옵니다. 0 01234 1 1234 2 234 3 34 4 4 이를 이중 for문에서 문자열 슬라이싱으로 구하고, 집합 자료형 set을 이용하면 중복을 제거할 수 있습니다. S = input() answer = set() for i in range(len(S)): for j in range(i, len(S)): part = S[i:j+1] answer.add(part) print(len(answer))
집합과 맵 문제입니다. 집합 A, B 를 받고 대칭 차집합 (A 교 B) 여 의 길이를 구해야 합니다. 집합 자료형 set로 숫자들을 받고 set 에서 사용 가능한 연산자를 이용하면 쉽게 구할 수 있습니다. import sys input = sys.stdin.readline M, N = map(int, input().split()) A = set(map(int, input().split())) B = set(map(int, input().split())) print(len((A-B) | (B-A)))