본문 바로가기

매일매일 (Everyday)

[BOJ] - 기본 수학 2 - (2) - Python

11653: 소인수분해

# 11653: 소인수분해
#
def prime_list(n):
    sieve = [True] * n

    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:
            for j in range(i+i, n, i):
                sieve[j] = False

    return [i for i in range(2, n) if sieve[i] == True]

import sys
N = int(sys.stdin.readline())
prime = prime_list(N)

j = 0
while True :

    if N in prime :
        print(N)
        break

    elif N % prime[j] == 0 :
        print(prime[j])
        N = N // prime[j]
    else :
        j += 1

    if N // prime[j] == 1 :
        print(N)
        break

##

def prime_list(n):
    sieve = [True] * n

    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:
            for j in range(i+i, n, i):
                sieve[j] = False

    return [i for i in range(2, n) if sieve[i] == True]

import sys
N = int(sys.stdin.readline())
sqrt_n= int(N**0.5)

i = 2
while i < sqrt_n :

    if N in prime_list(N) :
        print(N)

    if N % i == 0:
        print(i)
        N = N // i
    else:
        i += 1

    if N // i == 1:
        print(N)
        break

### 최종 풀이
n = int(input())
i = 2
while n != 1 :
    if n % i == 0 :
        n = n / i
        print(i)
    else :
        i += 1

이 문제에서 배운 점이 있다면, 선행 문제에 함수식을 그대로 사용하는 것이 아닌 문제 자체에서 고민하고 해결하는 것이 좋다는 점을 배웠습니다. 소인수분해 자체가 소수를 하나씩 나누어질때까지 지속해서 나누는 것이기 때문에 while 문 하나로 문제가 해결이 되었네요.

 

1085: 직사각형에서 탈출

# 1085: 직사각형에서 탈출

x, y, w, h = map(int, input().split())
print(min(h-y, x, y, w-x))

 

3009: 네 번째 점

# 3009: 네 번째 점
a = set()
b = set()
sum_x = 0
sum_y = 0
for _ in range(3) :
  x, y = map(int, input().split())
  sum_x += x
  sum_y += y
  a.add(x)
  b.add(y)

result_x = 4 * (sum(list(a))/2) - sum_x
result_y = 4 * (sum(list(b))/2) - sum_y


print(int(result_x), int(result_y), sep = ' ')

이 문제는 이렇게 푸는 것보단 XOR : '^' 을 이용하여 푸는 것이 아주 현명합니다.

1^2^1

2를 출력합니다. 정말 쉽죠..? 전 귀찮게 방정식으로 풀었네요 ㅠㅠ

 

4153: 직각삼각형

# 4153: 직각삼각형
while True:
        a = list(map(int, input().split()))
        max_num = max(a)
        if sum(a) == 0:
                break
        a.remove(max_num)
        if a[0] ** 2 + a[1] ** 2 == max_num ** 2:
                print('right')
        else:
                print('wrong')

**이 제곱입니다. 문제 조건때문에 쉽게 풀었던 것 같습니다.

 

기본 수학 파트 들어오고나서 하루안에 풀 수 있는 수준의 문제가 점점 없어지네요.. 더 열심히 해야겠어요. 터렛이랑

Fly me to the Alpha Centauri 문제 빨리 풀고 싶어요.