Reference
- 문제 출처 - HackerRank
- 파이썬 연습 - Practice - Python
개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다
개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다
문제 : AB, BC의 길이가 주어졌을 때 ∠MBC 의 각도를 구하는 문제(점 M은 빗변 AC의 정중앙이다)
입력 : 변 AB의 길이; 변 BC의 길이;
출력 : ∠MBC 의 각도 (정수로 반올림)
점 M이 직삼각형 ABC에서 빗변 AC의 중앙이기 때문에 작은 이등변 삼각형이 생기고 각 ∠MBC는 각 ∠MCB와 같다
즉 ∠MCB=∠ACB로 구한다
import math |
문제 : 양수 N이 주어졌을 때, N까지 증가하는 palindromic(회문) triangle을 출력하는 문제(단, 2줄 이내로 코드를 작성해야함)
입력 : 양수 N;
출력 : palindromic triangle 형태로 출력
참고 : Demlo Number
for문 하나만 사용하라고 하며(only 1 for is allowed) 에러를 발생한다
for i in range(1,int(input())+1): |
1 = 1
11 _ 11 = 121
111 _ 111 = 12321
1111 * 1111 = 1234321
for i in range(1,int(input())+1): |
문제 : 두개의 정수 a, b가 주어졌을 때 몫과 나머지를 출력하는 문제
입력 : 정수 a; 정수 b
출력 : 몫(a//b); 나머지(a%b); 몫과 나머지(a//b, a%b)
a = int(input()) |
조금더 짧게
a = divmod(int(input()), int(input())) |
문제 : 숫자 a, b, c가 주어졌을 때 a의 b제곱 값과 이를 c로 나눈 나머지를 구하는 문제
입력 : a; b; c
출력 : a의 b제곱; a ** b % c;
pow()
함수를 사용하는 매우 간단한 문제
a, b, m = int(input()),int(input()), int(input()) |
문제 : 실수 a, b, c, d가 주어졌을 때 a^b + c^d의 값을 구하는 문제
입력 : 실수 a; b; c; d
출력 : ab + cd의 값
a, b, c, d = [int(input()) for _ in '1234'] |
문제 : 양수 N이 주어졌을 때 1에서 N까지 증가하는 numerical triangle을 출력하는 문제
입력 : N;
출력 : numerical triangle
for i in range(1,int(input())): #More than 2 lines will result in 0 score. Do not leave a blank line also |
개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
math 모듈을 살펴보다가 기본 내장함수 pow()
가 있는데 왜 굳이 math.pow()
를 정의해 뒀을까 궁금해서 검색한 내용들을 정리해봤습니다.
짧은 다큐멘터리 Youtube링크 - Powers of Ten™ (1977)를 패러디한 만화입니다
두 함수의 정의를 봤을 때, 내장함수 pow()
에만 augment 하나가 더 옵션으로 들어갈 수 있는 것을 볼 수 있습니다.
pow(base, exp[, mod])
math.pow(x, y)
코드를 작성해서 확인해봐도 둘은 분명히 다른 함수인 것을 알 수 있습니다.
|
pow(base, exp)
이렇게 2개의 인자(augment)만 주어진다면 밑(base)의 지수(exp)승(또는, base의 exp제곱)한 값을 반환합니다. 반환되는 값의 자료형은 인자들의 자료형을 따라 Integer, Float, Complex number 등으로 결정됩니다.base ** exp
는 pow(base, exp)
와 똑같은 기능을 합니다.
>>> print(pow(10, 2)) |
pow(base, exp, mod)
세번째 인자[, mod]를 입력하면 base의 exp제곱한 값에 mod를 나눈 나머지 값을 반환합니다. 특히 세번째 인자가 있을 때, base와 exp는 정수형이여야 하고 exp는 양수 값이여야 합니다. pow(base, exp, mod)
를 사용하는 것이 pow(base, exp) % mod
로 계산하는 것 보다 효율적입니다.
>>> print(pow(10, 2, 3)) # 10^2 % 3 |
math.pow(x, y)
함수는 순수하게 거듭제곱의 연산 기능만 제공합니다.pow(base, exp)
함수 혹은 **
연산자와 다른 점으로 math.pow(x,y)
함수는 두 인자를 float 형으로 바꾼다는 점입니다.
pow(1.0, x)
이나 pow(x, 0.0)
의 결과값은 무조건 1.0을 반환합니다.(x가 0이거나 NaN 값이라도)import math |
x is inf / pow(1.0, x)= 1.0 pow(x, 0.0)= 1.0 |
pow(x, y)
에서 x와 y가 finite하고, x가 음수이고, y가 정수가 아니면 ValueError를 반환합니다.vals = [(1.23, 3.33), (-1.23, 2.0), (-1.23, -3.33)] |
x is 1.23, y is 3.33 / 1.9924343529238528 |
# executionTime.py written in PyCharm |
**
연산자가 큰 차이로 가장 빠르고 pow()
와 math.pow()
는 비슷비슷한 시간을 가집니다.
Int \*\* Int 0.012045001 |
입력되는 인자의 자료형과 상관없이 반환값을 무조건 실수형(float)으로 받고 싶을 때 math.pow()
함수를 사용하는 것이 좋습니다.
|
위 코드 결과와 같이, 정수형으로 반환되는 **
연산(혹은 pow()
) 결과를 float()
함수로 형변환 하는 것 보다 math.pow()
함수가 더 빠른 것을 볼 수 있습니다.
특별한 경우가 아니고 간단한 연산에 필요하다면 **
연산자를 사용하는 것이 가장 좋을 듯 합니다
개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다
수학 관련 Built-in functions
abs(x)
인자 x의 절대값을 반환합니다.
|
divmod(a, b)
복소수가 아닌 인자 a, b에 대한 나눗셈의 몫과 나머지를 반환합니다. 즉, 결과값이 (a//b, a%b)와 같습니다.
|
min(iterable, *[, key, default]) or min(arg1, arg2, *args[, key])
max(iterable, *[, key, default]) or max(arg1, arg2, *args[, key])
각각 최소값, 최대값을 구하는 함수입니다.
def findMax(num): |
Number with max remainder is: 19 |
sum(iterable, /, start=0)
iterable의 숫자들을 왼쪽부터 차례로 더하여 start의 값에 합한 값을 반환합니다. 즉, 전체합을 반환합니다.
|
pow(base, exp[, mod])
밑(base)의 지수(exp)만큼 거듭제곱한 값을 반환합니다. 옵션으로 mod 인자가 있는 경우 거듭제곱 값을 mod로 나눈 나머지를 반환합니다.
|
round(number[, ndigits])
반올림한 값을 반환합니다.
|
Math module
수학적 계산과 관련된 함수들을 제공하는 모듈(복소수는 cmath
모듈이 따로 존재)
내가 사용하는 환경 3.7.6v에서는 50개의 함수가 있다(작성일 기준 최신버전 3.8에서는 55개가 있음)
|
Python 버전: 3.7.6 |
표현 함수
함수 | 설명 |
---|---|
ceil(x) | 올림 |
floor(x) | 내림 |
trunc(x) | 절사 |
함수 | 설명 |
---|---|
cos(x) | 코사인 |
sin(x) | 사인 |
tan(x) | 탄젠트 |
acos(x) | 아크코사인 |
asin(x) | 아크사인 |
atan(x) | 아크탄젠트 |
atan2(x, y) | x/y 아크탄젠트 |
함수 | 설명 |
---|---|
cosh(x) | 하이퍼볼릭 코사인 |
sinh(x) | 하이퍼볼릭 사인 |
tanh(x) | 하이퍼볼릭 탄젠트 |
acosh(x) | 하이퍼볼릭 아크코사인 |
asinh(x) | 하이퍼볼릭 아크사인 |
atanh(x) | 하이퍼볼릭 아크탄젠트 |
함수 | 설명 |
---|---|
degrees(x) | 60분법으로 변환 |
radians(x) | 호도법으로 변환 |
함수 | 설명 |
---|---|
isclose(x, y, rel_tol=z) | x와 y가 (z*1e+02)% 내외로 가까우면 True, 아니면 False |
isinf(x) | x가 inf이면 True, 아니면 False |
isfinite(x) | x가 inf, nan이면 False, 아니면 True |
isnan(x) | x가 nan이면 True, 아니면 False |
함수 | 설명 |
---|---|
log(x, y) | y를 밑으로 하는 x 로그 |
log10(x) | 10을 밑으로 하는 x로그 |
log1p(x) | e를 밑으로 하는 x+1로그 |
log2(x) | 2를 밑으로 하는 x로그 |
함수 | 설명 |
---|---|
pow(x, y) | x의 y승 |
sqrt(x) | 루트 x |
erf(x) | 오차함수 |
erfc(x) | 여오차함수 |
exp(x) | e의 x승 |
expm1 | e의 x-1승 |
frexp(x) | x를 (가수부, 지수부)로 반환 |
ldexp(x, y) | x*(2^y) |
gamma(x) | 감마함수 |
lgamma(x) | 감마함수의 자연로그 |
factorial(x) | 팩토리얼 |
fsum([x, y, z, …]) | 리스트의 합 |
fmod(x, y) | x를 y로 나눈 나머지 |
fabs(x) | 절대값 |
gcd(x, y) | x와 y의 최대공약수 |
hypot(x, y) | 유클리드 놈을 반환 |
modf(x) | x를 (소수부, 정수부)로 반환 |
copysign(x, y) | y의 부호를 사용하는 x를 반환 |
함수 | 설명 |
---|---|
e | e |
pi | π |
tau | τ |
inf | ∞ |
nan | Not a Number |
Python 3.8.2 Documentation - Math
**Polar Coordinates**극좌표계 - 위키피디아
문제 : 복소수를 극좌표로 표현하는 문제
입력 : 복소수 z;
출력 : z를 극좌표에 표현했을 때의 r, ϕ를 출력
r : Distance from to origin, i.e.,
ϕ : Counter clockwise angle measured from the positive -axis to the line segment
polar(x)
함수는 abs(x)
, phase(x)
의 값을 반환한다
즉, 위 그림에서의 r(점까지의 거리), ϕ(위상) 에 해당한다
자세한 설명은 - cmath 모듈
import cmath |