백준(BOJ) 2541 점 파이썬(Python)

문제 링크

생각해보면 답이 간단한 수학 문제.
세 가지 규칙에 기반해서 집합에 계속 점(이긴 한데 그냥 순서쌍으로 생각해도 무방하다)을 추가하는 문제.
각 규칙의 함의는 다음과 같다.
규칙 1. 점에서 중요한 것은 xy의 차이와 시작점이다.
규칙 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')

2024

맨 위로 이동 ↑

2023

세그먼트 트리

개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...

벨만-포드 알고리즘

개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...

다익스트라 알고리즘

개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...

맨 위로 이동 ↑