[백준] 19532번(수학은 비대면강의입니다)

뱌·2023년 4월 26일

백준 문제풀이

목록 보기
52/159

백준 19532번


최종 제출 코드

a, b, c, d, e, f = map(int, input().split())

for i in range(-999, 1000):
  for j in range(-999,1000):
    if (a*i)+(b*j)==c and (d*i)+(e*j)==f:
      print(i, j)

◼ 처음에는 전형적인 연립방정식을 푸는 방식을 대입하려고 했으나, 끊임없는 ZeroDivisionError에 고통 받다가 다른 방법을 물색...

◼ 다른 코드를 참고하여 코드 작성(출처)

  • for문을 활용하여 x, y에 범위 내의 값을 직접 대입해보는 방법 활용
  • 실행시간은 오래 걸리지만 코드가 간단
  • ZeroDivisionError와 만나지 않음...

◼ 그러나 여기서 포기할 수 없다

  1. 이렇게 간단한 연립방정식 풀이를 포기하다니.. 앞으로 이 험한 세상을 어떻게 살아가는가
  2. 무엇보다 for문을 활용한 문제풀이는 (x, y)의 범위가 늘어나고 미지수와 식의 개수가 추가됨에 따라 실행시간이 걷잡을 수 없이 늘어남.
  3. 답이 정수가 아닌 경우 풀이 불가!

⇒ for문을 사용하지 않은 문제풀이... LET'S GET IT


처음 작성한 코드

def divide (a, b):
  if b==0:
    return 0
  else:
    return a/b

a, b, c, d, e, f = map(int, input().split())

if a!=0 and d!=0:
  a_ = a*d
  b_ = b*d
  c_ = c*d
  
  d = d*a
  e = e*a
  f = f*a
  
  y = int(divide((c_-f), (b_-e)))
  x = int(divide((c_-b_*y), a_))

elif a==0:
  y = int(divide(c, b))
  x = int(divide((f-e*y), d))
elif d==0:
  y = int(divide(f, e))
  x = int(divide((c-b*y), a))

print(x, y)

◼ ZeroDivisionError를 해결하기 위해 나누기 과정을 함수로 정의

  • 분모로 0이 들어올 경우 가차없이 0을 return!
    ❓ 0으로는 다른 숫자를 나눌 수 없는데 무슨 소리야!
    ⇒ 생각해보니 if문으로 a와 d가 0일 때를 처리해주면 정말로 필요없는 부분... 삭제하였다

◼ x를 먼저 소거하는 형태로 문제 풀기

  1. a와 d 둘 다 0이 아닌 경우. 즉, 두 개의 식 모두에 x가 존재하는 경우
    -일반적으로 연립방정식을 푸는 방식을 그대로 대입하기 가능!
  2. a만 0인 경우.
    -첫 번째 식에서 y 값을 구하고 구해진 y 값을 이용하여 두 번째 식에서 x 값을 구한다.
  3. d만 0인 경우.
    -두 번째 식에서 y 값을 구하고 구해진 y 값을 이용하여 첫 번째 식에서 x 값을 구한다.

최종 수정 코드

a, b, c, d, e, f = map(int, input().split())

if a!=0 and d!=0:
  a_ = a*d
  b_ = b*d
  c_ = c*d
  
  d = d*a
  e = e*a
  f = f*a
  
  y = int((c_-f) / (b_-e))
  x = int((c_-b_*y) / a_)

elif a==0:
  y = int(c / b)
  x = int((f-e*y) / d)
elif d==0:
  y = int(f / e)
  x = int((c-b*y) / a)

print(x, y)

실행 결과

◼ 위쪽이 연립방정식을 활용한 문제풀이, 아래쪽이 for문을 활용한 문제풀이

  • 후자보다 전자가 코드는 복잡하지만 실행 시간이 훨씬 짧은 것을 볼 수 있다!

마무리

◼ 다른 사람의 코드를 찾아보니 가감법을 활용하면 쉽게 문제풀이가 가능하다고 한다.(출처)

◼ 만약에 미지수의 개수가 3개가 된다면...? 흠...

profile
백엔드 개발자가 되고 싶어요(22.8.15~)

0개의 댓글