파이썬 사칙연산 문제풀이 - 백준(BAEKJOON)

카고챵

·

2021. 10. 23. 23:42

반응형

파이썬 사칙연산 문제풀이 - 백준(BAEKJOON)

이번 포스팅에서는 지난 포스팅에 이어서 백준 단계별로 풀어보기의 문제를 이용하여 사칙연산 부분을 풀어보았다.

지난 포스팅 : 파이썬 입출력 문제풀이

 

파이썬 입출력 문제풀이 - 백준 (BAEKJOON)

파이썬 입출력 문제풀이 - 백준 (BAEKJOON) 앞으로 알고리즘 공부와 함께 프로그래밍 언어 사용 능력을 기르기 위해서 위해 백준 문제를 풀어볼 예정이다. 이전 포스팅 참고 나도코딩 파이썬 6시간

kgokapc.tistory.com

사용언어 : Python3 

백준 -> 단계별로 풀어보기 -> 입출력과 사칙연산 부분의 사칙연산 부분을 풀어보는 포스팅입니다.


5단계 - A+B

문제 번호 1000번 A+B, 한 줄에 두 수를 입력받고 그 두 수를 더하는 프로그램을 작성하면 된다.

a = input()
b = input()
print(a+b)

 

위와 같이 코드를 작성하고 제출하였는데 런타임 에러가 발생하였다. 오류가 발생하는 이유를 분석해보았는데 크게 2가지의 이유가 있었다.

1. 잘못된 입력 구조

나는 input() 함수를 1, 2번 라인에 따로 작성했다.

문제에서는 a, b를 한 줄에 입력시키는데 나는 2줄에 걸쳐서 입력받게 코드를 작성해서 출력 단계 자체를 가지 못했다. input 함수를 1번 라인에만 써서 a, b를 한 번에 입력받고 split() 함수를 사용해서 나누어주어야 한다.

2. input는 입력된 값을 문자열로 저장함

파이썬에서 input 함수는 입력된 값을 문자열로 저장한다. 따라서 위의 1번 조건을 만족했어도 출력 값에 오류가 있었을 것이다.

EX)

  1. input 함수를 통해서 a = 1, b = 2 입력 받음
  2. 문자열로 인식
  3. a+b 계산 시 (문자열 1 + 문자열 2)로 계산
  4. 출력 시 "12" 출력

따라서 입력받은 값을 3번 계산 과정을 거치기 전에 정수로 자료형을 변경해주어야 한다.

아래는 수정한 코드이다.

a, b = input().split()
print(int(a)+int(b))

6단계 - A-B

문제 번호 1001번 A-B이다. A+B문제에서 + 부분을 -부분으로 수정해주었다.

a, b = input().split()
print(int(a)-int(b))

7단계 - A×B

문제 번호 10998 A×B이다. 위와 코드는 같되 - 부분을 곱셈을 뜻하는 *로 변경해주었다.

a, b = input().split()
print(int(a)*int(b))

8단계 - A/B

문제 번호 1008 A/B이다. 두 정수 A와 B를 입력받은 다음 A/B를 출력하는 코드를 작성하면 된다.

마찬가지로 나는 위의 코드에서 * 부분을 나눔셈을 뜻하는 / 로 변경해주었다.

a, b = input().split()
print(int(a)/int(b))

9단계 - 사칙연산

문제 번호 10869번 사칙연산이다. 두 자연수 A와 B가 주어지고 A+B, A-B, A*B, A/B, A%B(나머지)를 차례로 출력하는 코드를 작성하면 된다.

난 아래와 같이 코드를 작성하였다.

a, b = input().split()
print(int(a)+int(b))
print(int(a)-int(b))
print(int(a)*int(b))
print(int(a)/int(b))
print(int(a)%int(b))

그런데 오류가 발생하였다. 코드는 정상적으로 작동하는데 결과에 "잘못된 풀이"라고 출력되길래 예제를 코드에 입력해보았다.

위의 코드에 예제 1을 입력하면 순서대로 10, 4,21, 2.3333333333333335, 1이 출력되는데 이건 문제의 "예제 출력 1"과 다른 결과다. 보아하니 나눗셈의 결과를 정수로 출력해야 하기 때문에 아래와 같이 나눗셈 부분에는 int로 한 번 더 묶어주었다.

a, b = input().split()
print(int(a)+int(b))
print(int(a)-int(b))
print(int(a)*int(b))
print(int(int(a)/int(b)))
print(int(a)%int(b))

출력문 하나마다 int로 묶기에 번거로우니 아래와 같이 계산 전에 input로 입력받은 문자열을 정수형으로 미리 변경한 뒤에 계산한 후에 출력하여도 된다.

a,b = input().split()
a = int(a)
b = int(b)
print(a+b)
print(a-b)
print(a*b)
print(int(a/b))
print(a%b)

10단계 - 나머지

10430번 문제 나머지이다. 세 수 A, B, C가 주어졌을 때 첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력하는 코드를 작성하여야 한다.

코드는 아래와 같이 작성하였다.

a,b,c = input().split()
a = int(a)
b = int(b)
c = int(c)
print((a+b)%c)
print(((a%c)+(b%c))%c)
print((a*b)%c)
print(((a%c)*(b%c))%c)

11단계 - 곱셈

2588번 문제인 곱셈이다. 세 자리 자연수 2개를 입력받았을 때 위의 그림처럼 계산할 때 (3), (4), (5), (6) 번 위치에 들어갈 값을 구하는 코드를 작성하여야 한다.

코드는 아래와 같이 작성하였다.

a= input()
b= input()
a = int(a)
b = int(b)
sam = a* ((b % 100)%10)
sa = a* int(((b % 100) - ((b % 100)%10))/10)
o = a*(int(b / 100))
yuk = a*b
print(sam)
print(sa)
print(o)
print(yuk)

사칙연산으로만 문제를 풀려고 머리를 싸매가면서 코딩했는데.. 더 간단하고 편하게 푸는 방법이 있었다.

바로 b를 문자열 그대로 놔두고 인덱스로 접근하여 뽑아낸 부분을 정수인 a와 계산시키는 것이다.

코드는 아래와 같다.

a,b = input().split()
a = int(a)
sam = a * int(b[2])
sa = a * int(b[1])
o = a * int(b[0])
yuk = a * int(b)
print(sam)
print(sa)
print(o)
print(yuk)

내가 짠 첫 번째 코드는 이런 방법도 있구나 정도로 생각해주면 좋을 것 같다. 물론 첫 번째 코드를 이용해도 문제는 풀린다. 내가 인덱스를 사용하지 않고 어떻게 필요한 숫자들을 뽑아냈는지 확인해보는 것도 재미있을 것이다.

이렇게 2번의 포스팅에 걸쳐서 백준의 단계별로 풀어보기 -> 입출력과 사칙연산 부분을 모두 풀어냈다. 

뿌ㅡ듯

하지만 아직 여러 단계가 더 남아있고 나의 알고리즘 능력 향상을 위해서 백준 문제는 꾸준히 풀어볼 것이다. 파이팅!

포스팅 읽어주셔서 감사합니다. 댓글과 공감은 작성자에게 큰 힘이 됩니다. 

반응형