brunch

You can make anything
by writing

C.S.Lewis

by 김지영입니다 Jan 21. 2024

외계어 배우기 - 문제#2 ConeVolume: 수학

Python을 배워봅시다

WordCount 문제를 해결했으니 두 번째 문제인 ConeVolume(원뿔의 부피) 문제를 해결해 보자.


도전과제: 직원뿔의 부피를 계산합니다.
덧, 직원뿔이란 축, 즉 꼭짓점과 밑면의 중심을 잇는 직선이 수직인 원뿔을 말한다.


원뿔의 부피를 구하려면, 수학이 필요하다. 즉, 문자열을 정수로 만드는 과정이 필요하고 또 파이썬에서의 수학 계산에 대해서도 알아야 한다. 코드에 대해서는 이번에도 책에서 친절히 알려준다. (정수에 대해서는 문제#1의 내용을 참고하자.)


입력: 입력은 두 줄의 텍스트로 구성되며, 첫 번째 줄은 원뿔의 반지름인 정수 r이고 두 번째 줄은 원뿔의 높이인 정수 h이다. r과 h는 모두 1과 100 사이의 값이다. 다시 말해, r과 h는 최솟값이 1이고 최댓값이 100이다.

수학시간에 배운 것을 떠올려보자. 원뿔의 부피는 다음과 같다. 부피는 (π(원주율) 곱하기 r(반지름)의 제곱 곱하기 h(높이))의 삼분의 일 값이다.

덧, 브런치는 수식을 쓰기가 너무 어렵네


파이썬에서 수학 계산을 해보자.

우선 π는 3.1415926535 8979323846 2643383279......이다. 학교 다닐 때 이걸 누가 더 길게 외우는지 서로 대결(?)해보곤 했는데, 지금 생각해 보면 참 의미 없는 짓이었던 것 같다. 여하튼, π값을 사용하기 위해 할당문을 작성해 보자.


PI = 3.141592653589793


여기서 PI는 일정한 값으로 유지되는 데이터이기 때문에(잠겨있음) 변수가 아니고 상수(constant)이다. 상수는 대문자를 사용하는 것이 파이썬의 규칙이다.


r 제곱의 경우 지수대신 곱셈을 사용하여 r * r로 표기할 수도 있다. 그렇지만 지수를 사용하는 것이 더 명시적이기 때문에 지수 연사자인 **을 사용한다. 직원뿔의 부피를 구하는 수식을 다시 작성해 보자.


Volume = (PI * (r ** 2) * h) / 3


r과 h가 정수라고 해도 /(나눗셈) 연산자는 부동 소수점 수로 반환될 수 있다. 문제#1에서 한번 언급된 적이 있는 부동 소수점 수에 대해 이야기해 보자.

Chatpy says,
부동 소수점 수는 파이썬에서 부동 소수점 숫자(또는 부동 소수점)는 소수점이 있는 숫자입니다. 부동 소수점은 분수뿐만 아니라 과학적 표기법에서 매우 크거나 매우 작은 숫자를 나타내는 데 사용할 수 있습니다. 정수와 동일한 산술 연산을 수행할 수 있으나 부동 소수점 표현의 특성으로 인해 부동 소수점을 이용한 나눗셈은 반올림 오류가 발생할 수 있습니다.

반지름 r은 4이고, 높이 h는 6이라고 가정하자.


이제 반지름과 높이를 입력에서 읽어 와서 그 값으로 원뿔의 부피를 계산해 보자. 아, 그런데 이전에 정리한 내용을 기억하지? input 함수는 항상 문자열만 반환한다는 것...

이처럼 정수를 입력했지만 문자열(작은따옴표)을 반환했다. 문자열은 수학 계산을 하는 데 사용할 수 없다. 그래서 계산을 시도하면 다음과 같은 결과가 나온다. 헐~

덧, PyCham을 사용한 결과이기 때문에 다른 편집기나 터미널에서는 다르게 나타날 수 있다. TypeError만 참고하도록 하자. 여기에서 pow 함수는 거듭제곱을 의미한다. 'str'과 'int'는 아래에서 설명할 것이다.
타입 오류: r이 참고하는 문자열과 정수 2 사이의 지수 연산(** 혹은 pow())을 지원하지 않는다.


수학 계산을 수행하려면 문자열을 정수로 변환하여야 하며, int 함수를 사용하면 가능하다. 그런데 이때 앞뒤 공백은 처리할 수 있지만 숫자를 나타내지 않는 문자는 정수 변환이 불가능하다.

문자열을 정수로 변환하는 방법은 두 가지가 있는데, 1) 입력의 반환 값을 변수에 할당한 다음 해당 값을 정수로 변환하는 것과 2) input 함수와 int 함수 호출을 결합하는 방법이다. 2)의 경우 인자가 먼저 처리된다. 영상을 보면 이해하기가 쉬울 것이다.

반대로 정수를 문자열로 변환하는 str 함수도 사용할 수 있다. 정수는 문자열과 연결할 수 없다.

덧, 왜 정수와 문자열을 연결할 수 없게 만들었는지는 모르겠다. 정수를 문자열로 바꾼 후 문자열끼리 연결하는 것은 귀찮은 과정만 만들 뿐인데...


매거진의 이전글 외계어 배우기 - 문제#1 WordCount
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari