(전공복습) 데이터과학 4. 시각화
차례
생각해보면 답이 간단한 수학 문제.
세 가지 규칙에 기반해서 집합에 계속 점(이긴 한데 그냥 순서쌍으로 생각해도 무방하다)을 추가하는 문제.
각 규칙의 함의는 다음과 같다.
규칙 1. 점에서 중요한 것은 x
와 y
의 차이와 시작점이다.
규칙 2. 차이와 시작점을 2로 나누어 당길 수 있다.
규칙 3. 차이를 n
배수 할 수 있다(n > 0
).
예를 들어 시작점이 (8, 14)
라면 이 점부터 두 축 값의 차이가 6
인 모든 점은 집합에 속한다.
규칙 2에 따라, (4, 7)
부터 두 축 값의 차이가 3
인 모든 점도 집합에 속한다.
당연히 규칙 3에 따라 차이가 3, 6, 9, 12, ...
인 모든 수는 집합에 속한다.
그런데, 차이와 시작점을 2
로 나누면서 동시에 차이는 n
배수가 가능한데, n = 2
인 경우 차이는 그대로 두고 시작점을 2
로 계속 나눌 수 있다는 것을 의미한다.
즉, 차이의 최솟값은 2
로 최대한 나눈 경우에 나오는 수이고(예시의 경우에는 6/2=3
), 시작점의 최솟값은 계속 2
로 나눌 수 있으므로 결국은 1
이 된다.
다시 말해, (1, y)
또는 (x, 1)
부터 시작해서, 차이를 최대한 2
로 나눈 값의 n
배수에 포함되는 점은 모두 집합에 속한다.
#!python
from math import ceil
# a가 b의 1 이상의 배수인지 확인하는 함수
def is_multi(a, b):
# b == 0인 경우 몇 배를 하든지 0이고 0이 아니라면 배수가 아님
if b == 0:
if a == 0:
return True
return False
# 그 외의 경우 0배수거나 음수 배수인 경우에는 False고 아니면, 배수 여부에 따라 반환
if a // b <= 0:
return False
return a % b == 0
a, b = map(int, input().split())
# 가능한 만큼 a와 b를 나누어 차이의 최소값을 찾음
while (a - b) % 2 == 0:
a , b = ceil(a / 2), ceil(b / 2)
if a == b == 1:
break
for _ in range(5):
p, q = map(int, input().split())
# 만약 p와 q의 차가 a와 b의 차의 n배수라면 속하고 아니면 속하지 않음
if is_multi(p - q, a - b):
print('Y')
else:
print('N')
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...