Skip to content
CatBus

Tag: math

All the articles with the tag "math".

BACKGROUNDEuclidean

a,bZa, b \in \mathbb{Z}이고 aabb로 나눈 나머지를 rr이라 하자. (ba,0rbb \leq a, 0 \leq r \leq b)

a,ba, b의 최대 공약수를 (a,b)(a, b)라고 하면, 다음이 성립한다.

(a,b)=(b,r)(a, b)=(b, r)

출처: wikipidia

rr이 0이 될 때 알고리즘을 멈추며, 이 때의 bb가 최대공약수가 된다.

예를 들어 1460과 1037에 대해 알고리즘을 진행해보면 다음과 같다.

\begin{flalign*} (1460, 1037)\\=(1037, 323)\\=(323, 68)\\=(68, 52)\\=(52, 16)\\=(16, 4)\\=(4,0) \end{flalign*}

rr이 0일때 bb가 4이므로 1460과 1037의 최대공약수는 4이다.

유클리드 호제법

유클리드 호제법은 2개의 자연수에 대해 최대공약수를 구하는 알고리즘이며 다음과 같은 성질을 통해 알고리즘을 진행한다.

2022.11.22·1분·math
BOJ1004SILVER 3
  • 1000x1,y1,x2,y2,cy,cx 10001000 ≤ x_1, y_1, x_2, y_2, c_y, c_x ≤ 1000
  • 1r10001 ≤ r ≤ 1000
  • 1n501 ≤ n ≤ 50
  • 좌표와 반지름은 모두 정수

행성계를 꼭 통과해야 하는 조건을 먼저 찾는. 출발점이나 도착점이 행성계 안에 있을 경우 무조건 그 항성계를 통과해야 한다. 출발점이나 도착점을 포함하지 않고 있는 행성계는 어떻게든 피해갈 수 있기 때문이다.

한 점이 원 안에 포함되어있는지 확인하려면, 원의 반지름과 원의 중심과 그 점 사이의 거리를 비교하면 된다. 원의 반지름이 더 크다면 그 점은 무조건 원 안에 위치하게 되고, 원의 중심과 그 점 사이의 거리를 비교하면 그 점은 원 밖에 위치하게 된다.

t = int(input())
for _ in range(t):
    cnt = 0
    x1, y1, x2, y2 = map(int, input().split())
    n = int(input())
    for _ in range(n):
        c_x, c_y, r = map(int, input().split())
        r = r ** 2
        dis1 = (c_x - x1) ** 2 + (c_y - y1) ** 2
        dis2 = (c_x - x2) ** 2 + (c_y - y2) ** 2
        if (dis1 < r and dis2 < r) or (dis1 > r and dis2 > r):
            continue
        else:
            cnt += 1
    print(cnt)

어린 왕자

백준 1004번 '어린 왕자' (실버 3) 문제 풀이. math, geometry 로 접근했다.

2022.11.15·4분·math
BOJ1037BRONZE 1
div = list(map(int, input().split()))
min, max = float('inf'), float('-inf')
for d in div:
    if min > d : min = d
    if max < d : max = d
print(min * max)

약수

백준 1037번 '약수' (브론즈 1) 문제 풀이. math, number theory 로 접근했다.

2022.11.15·2분·math
BOJ1009BRONZE 2
nums = {1 : [1],
        2 : [2, 4, 8, 6],
        3 : [3, 9, 7, 1],
        4 : [4, 6],
        5 : [5],
        6 : [6],
        7 : [7, 9, 3, 1],
        8 : [8, 4, 2, 6],
        9 : [9, 1]}

for _ in range(n):
    a, b = map(int, input().split())
    # a의 1의 자리수를 구한다 -> 4
		one = a % 10

		# 1의 자리에 나올 수 있는 값들을 가져온다 -> nums[4] -> [4, 6]
		# 이 중에서 b번째 값을 취한다. 4, 6, 4, 6, 4, 6 -> 6
    print(nums[one][(b - 1) % len(nums[one])])

단 a의 1의 자리가 0일 경우 무조건 제곱한 수의 1의 자리도 0이므로 10번 컴퓨터가 처리하게 된다.

분산 처리

백준 1009번 '분산 처리' (브론즈 2) 문제 풀이. math, implementation 로 접근했다.

2022.06.13·5분·math
BOJ1011GOLD 5
import sys, math

i = int(sys.stdin.readline())
for _ in range(i):
    n, m = map(int, sys.stdin.readline().split())
    N = m - n
    r_N = math.sqrt(N)
    N_int = math.trunc(r_N)
    if r_N == N_int: print(N_int * 2 - 1)
    else:
        if N > N_int * (N_int + 1):
            print(N_int * 2 + 1)
        else:
            print(N_int * 2)

Fly me to the Alpha Centauri

백준 1011번 'Fly me to the Alpha Centauri' (골드 5) 문제 풀이. math 로 접근했다.

2022.03.11·5분·math
BOJ10610SILVER 5
nums = str(sys.stdin.readline().strip())
if '0' not in nums:
    print(-1)
else:
    l = [0] * (int(max(nums)) + 1)
    s = ''
    sum = 0
    for i in nums:
        l[int(i)] += 1
    for i in range(len(l)-1, 0, -1):
        s += str(i) * l[i]
        sum += i * l[i]
    if sum % 3 == 0: print(int(s) * (10 ** l[0]))
    else: print(-1)

30

백준 10610번 '30' (실버 5) 문제 풀이. math, string, greedy algorithm 로 접근했다.

2022.02.04·3분·math