코드 발전소

[백준 문제집][Python 배우기 (1~50)][1000, 10998, 1001, 1008, 10869] 사칙연산 본문

백준 문제집/Python 배우기(1~50)

[백준 문제집][Python 배우기 (1~50)][1000, 10998, 1001, 1008, 10869] 사칙연산

FeCa 2019. 12. 23. 23:04

이 글에서 살펴볼 문제는 백준 1000, 10998, 1001, 1008, 10869번입니다.

해당 문제들은 모두 "사칙연산 구현"이라는 카테고리에 포함되기 때문에,

문제를 모두 묶어 한 번에 해결하고자 합니다.

주소는 아래와 같습니다.

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

 

1000번: A+B

문제 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 A와 B가 주어진다. (0 < A, B < 10) 출력 첫째 줄에 A+B를 출력한다. 예제 입력 1 복사 1 2 예제 출력 1 복사 3 힌트 여기를 누르면 1000번 예제 소스를 볼 수 있습니다....

www.acmicpc.net

 

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

 

10998번: A×B

두 정수 A와 B를 입력받은 다음, A×B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

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

 

1001번: A-B

두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

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

 

1008번: A/B

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

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

 

10869번: 사칙연산

두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. 

www.acmicpc.net

automata님의 문제집, "Python 배우기 (1~50)"의 2, 3, 4, 5, 6번 문제입니다.

 

 

 

 1. 문제 이해                                                                  

 

문제들은 모두 사칙연산을 구현하는 문제입니다.

입력, 출력의 형태도 모두 동일하므로

10869번, 사칙연산 문제만 해당 글에서 다루겠습니다.

문제는 다음과 같습니다.

잠시 문제를 간단하게 살펴보면,

"입력받은 두 자연수의 사칙연산 및 나머지 연산을 수행하는 문제"임을 알 수 있습니다.

문제의 시간 제한, 메모리 제한은 다음과 같습니다.

문제의 입력과 출력은 다음과 같습니다.

입력은 다음과 같은 형태로 이루어집니다.

출력은 다음과 같은 형태로 이루어집니다.

 

 2. 어떻게 해결할 것인가?                                                  

 

 2-1. 입력의 공백 문제                                        

 

만약, Python을 다루면서 해당 입력 예제를 처음 보신다면 당황하실 수도 있습니다.

그 이유는 다음 예시를 살펴보며 설명하겠습니다.

1
2
3
_input = input()
 
print(_input)

이러한 코드가 있다고 가정합시다.

이 코드를 실행시키고 해당 입력 예제를 다음과 같이 그대로 입력해본다면,

당연하지만, 변수 _input에 문자열 "3 5"가 저장되는 모습을 볼 수 있습니다.

Python은 C, C++과 다르게, input() 함수 하나는 한 줄 전체를 모두 문자열로 받아들인다는 것을 알 수 있습니다.

해당 문제에 봉착하신 분들이 Python의 인덱싱이나, 슬라이싱을 배우셨다면,

아주 다양한 방법으로 이 문제를 해결하실 수는 있습니다.

하지만, 입력 하나 때문에 정말 귀찮은 시간을 보내게 되실 겁니다.

여기서는 해당 입력 문제의 해결 방법에 대해 고민하시는 분들에게 간단한 해결책을 드리고자 합니다.

// 해결책 : split() 함수를 이용한다.

아마 많은 분들이 알고 계실 것이고,

Python 문법책으로 입출력에 대해 공부하신 분들도 알고 계실 것입니다.

spilt() 함수에 대해 잠시 설명을 드리자면,

spilt() 함수는 문자열에 관련된 함수로써,

문자열을 '괄호 안에 들어가 있는 문자'를 기준으로 나눠버립니다.

이렇게 말이죠.

 

https://wikidocs.net/13#split

 

나눠버린 뒤에는, 나뉘어 버린 문자열들을 모두 리스트에 저장해서 그 리스트를 리턴합니다.

따라서, input() 함수와 split() 함수를 함께 사용한다면,

공백을 기준으로 문자열을 나누어 리스트에 그 값을 각각 저장시킬 수 있다는 결론에 다다릅니다.

한 가지 코드를 예시로 들어보겠습니다.

1
2
3
_list = input().split()
 
print(_list)

 

위 코드를 실행시키면 다음과 같이 _list 변수에 각각의 값이

공백을 기준으로 나뉘어 리스트로 저장됨을 볼 수 있습니다.

 

혹은, 이러한 방법으로 변수에 따로 값을 저장할 수도 있습니다.

1
2
3
4
string1, string2 = input().split()
 
print(string1)
print(string2)

 

물론, string1과 string2의 리턴 타입은 문자열입니다.

 2-2. 사칙연산 구현                                            

 

입력을 받았다면, 입력받은 값들을 이용해 사칙연산 알고리즘을 구현해야 합니다.

아마 여러분들의 머릿속에서는 어떻게 구현을 진행해야 할지 이미 감이 잡히셨을 것입니다.

저는 크게 두 가지 방법으로 구현할 수 있다고 생각합니다.

1. 사칙연산에 대한 함수를 정의하여 리턴 값을 출력한다.

2. print() 함수의 괄호 속에 사칙연산을 직접 대입하여 출력한다.

Python에서 함수를 어떻게 정의하는지 알고, 입출력 문법에 대해 알고 계시다면,

아주 쉬운 문제가 되겠습니다.

 

 3. 문제 해결                                                                  

 

우선, 2.에서 제시한 두 가지 해결 방법 중 전자의 방법으로 코드를 구현해보겠습니다.

사칙연산과 나머지 연산의 함수들을 각각 정의하면 다음과 같이 정의할 수 있겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 덧셈
def add(a, b):
    return a + b
 
# 뺄셈
def sub(a, b):
    return a - b
 
# 곱셈
def mul(a, b):
    return a * b
 
# 나눗셈
def div(a, b):
    return a / b
 
# 나머지
def remainder(a, b):
    return a % b

 

문제의 입력 양식에 맞게 입력 부분의 코드를 작성하면 다음과 같이 구현할 수 있습니다.

1
a, b = input().split()

 

입력받은 두 정수들을 함수에 매개변수로 대입하고 그 리턴 값을 출력하는 코드를 작성하면,

1
2
3
4
5
6
7
8
9
# a와 b는 자료형이 문자열이므로 연산을 위해 정수로 바꾸어 줍니다.
= int(a)
= int(b)
 
print(add(a, b))
print(sub(a, b))
print(mul(a, b))
print(div(a, b))
print(remainder(a, b))

 

위와 같이 작성할 수 있겠습니다.

따라서, 전체 코드는 다음과 같습니다.

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
# 덧셈
def add(a, b):
    return a + b
# 뺄셈
def sub(a, b):
    return a - b
# 곱셈
def mul(a, b):
    return a * b
# 나눗셈
def div(a, b):
    return a / b
# 나머지
def remainder(a, b):
    return a % b
 
a, b = input().split()
 
# a와 b는 자료형이 문자열이므로 연산을 위해 정수로 바꾸어 줍니다.
= int(a)
= int(b)
 
print(add(a, b))
print(sub(a, b))
print(mul(a, b))
print(div(a, b))
print(remainder(a, b))

후자의 방법으로도 구현을 진행해보겠습니다.

너무 간단하고, 전자의 방법과 매우 유사하기에 전체 코드만을 보여드리겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
a, b = input().split()
 
# a와 b는 자료형이 문자열이므로 연산을 위해 정수로 바꾸어 줍니다.
= int(a)
= int(b)
 
# 덧셈
print(a + b)
 
# 뺄셈
print(a - b)
 
# 곱셈
print(a * b)
 
# 나눗셈
print(int(a / b))
 
# 나머지 연산
print(a % b)

 

 4. 코드 제출 및 결과                                                        

 

두 코드 모두 정답임을 확인할 수 있습니다.

 

 5. 문제의 정답 비율                                                         

 

정답 비율은 대략 절반인 56.552% 입니다.

 6. 다른 정답자들과의 코드 비교                                          

 

정답자들의 코드는 대부분 비슷하거나 동일하므로 생략합니다.

오답자들의 대표적인 코드는 다음과 같습니다.

대부분의 오답자분들이 위와 같은 "실수"를 하셨습니다.

문제의 부분은 코드 4번째 줄의 나눗셈 출력 부분입니다.

이 문제에서는 나눗셈의 출력 결과가 '정수'의 형태로 나타나야만 합니다.

따라서 코드의 "a / b"를 "int(a/b)"로 고쳐야 정답이 되겠습니다.

이전 글에서도 했던 말이지만,

충분히 할 수 있는 사소한 실수들이니 조금 더 유심히 출력 조건을 확인할 필요가 있습니다.

 

 7. 결론                                                                         

 

너무 간단한 문제이니 결론은 내지 않겠습니다.

긴 글 읽어주신 여러분들께 진심으로 감사드립니다.

좋은 날 되세요.