본문 바로가기

코딩/백준

[백준] 15888번 : 정답은 이수근이야!! (Python 파이썬)

알고리즘 분류 : 수학, 브루트포스 알고리즘

https://www.acmicpc.net/problem/15888

 

15888번: 정답은 이수근이야!!

0이 아닌 세 개의 정수 A, B, C가 주어진다. (-100 ≤ A, B, C ≤ 100) 이는 Ax2 + Bx + C = 0꼴인 이차방정식의 계수를 의미한다.

www.acmicpc.net

[ 풀이 ]

 이 문제는 이차방정식의 판별식과 근을 구하는 근의 공식을 알아야 풀 수가 있다. 

 ax²+bx+c=0 꼴인 이차방정식에서 서로 다른 두 근이 존재하려면 판별식 b^2 - 4*a*c>0 이 되야 한다.

 그리고 이 부등식을 만족시킨다고 해도 답이 "이수근"이 되려면 두 근이 모두 2^k 가 되야 한다.

 이때 두 근을 근의 공식으로 구하고 두 근이 2^k 인지 구하기 위해 두 근을 계속 2로 나누다가 1이 되면 2^k,

 1보다 작다면 2^k 이 아니다.

그리고 "이수근"이 아니라면 "정수근"인지 확인을 해야 한다. int(x1)과 int(x2)가 각각 x1, x2와 같다면 "정수근"이다. 

마지막으로 판별식 b^2 - 4*a*c<=0 이거나 int(x1)과 int(x2)가 각각 x1, x2와 다르다면 "둘다틀렸근"이 된다.

 

[ 코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import math
import sys
a,b,c=map(int,input().split())
t1,t2=0,0
 
if b*b-4*a*c>0:
    x1=((-1*b)+math.sqrt(b*b-4*a*c))/(2*a)
    while True:
        x1/=2
        if x1==1
            t1=1
            break
        elif x1<1: break
 
    x2=((-1*b)-math.sqrt(b*b-4*a*c))/(2*a)
    while True:
        x2/=2
        if x2==1
            t2=1
            break
        elif x2<1: break   
 
    if t1==t2==1
        print("이수근")
        sys.exit()
    else
        x1=((-1*b)+math.sqrt(b*b-4*a*c))/(2*a)
        x2=((-1*b)-math.sqrt(b*b-4*a*c))/(2*a)
        if int(x1)==x1 and int(x2)==x2:
            print("정수근")
            sys.exit()
print("둘다틀렸근")