AttackOnNunu

Once more into the fray


  • 홈

  • About

  • 태그

  • 카테고리

  • 아카이브

  • 검색

(PYTHON) Day - 13 Math(2)

작성일 2020-03-03 In LANGUAGE 🚀 , PYTHON , HACKERRANK 댓글:

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank

HackerRank의 Python 연습문제들은 아래와 같은 카테고리로 분류 된다

Subdomain

- ~~Introduction~~
- ~~Basic Data Types~~
- ~~Strings~~
- ~~Sets~~
- <strong style="color:blue">Math</strong>
- Itertools
- Collections
- Date and Time
- Errors and Exceptions
- Classes
- Built-Ins
- Python Functionals
- Regex and Parsing
- XML
- Closures and Decorators
- Numpy
- Debugging

Math

Problem

  • Find Angle MBC
  • Triangle Quest 2
  • Mod Divmod
  • Power - Mod Power
  • Integers Come In All Sizes
  • Triangle Quest

Find Angle MBC


문제 : AB, BC의 길이가 주어졌을 때 ∠MBC 의 각도를 구하는 문제(점 M은 빗변 AC의 정중앙이다)
입력 : 변 AB의 길이; 변 BC의 길이;
출력 : ∠MBC 의 각도 (정수로 반올림)

  • INPUT
  • OUTPUT

10
10

45°

점 M이 직삼각형 ABC에서 빗변 AC의 중앙이기 때문에 작은 이등변 삼각형이 생기고 각 ∠MBC는 각 ∠MCB와 같다
즉 ∠MCB=∠ACB로 구한다

import math
AB = float(input())
BC = float(input())

print(str(int(round(math.degrees(math.atan2(AB, BC)))))+'°')

Triangle Quest 2


문제 : 양수 N이 주어졌을 때, N까지 증가하는 palindromic(회문) triangle을 출력하는 문제(단, 2줄 이내로 코드를 작성해야함)
입력 : 양수 N;
출력 : palindromic triangle 형태로 출력
참고 : Demlo Number

  • INPUT
  • OUTPUT

5

1
121
12321
1234321
123454321

for문 하나만 사용하라고 하며(only 1 for is allowed) 에러를 발생한다

for i in range(1,int(input())+1):
print(_[k for k in range(1, i+1)], _[k for k in range(i-1, 0, -1)], sep='')

1 = 1
11 _ 11 = 121
111 _ 111 = 12321
1111 * 1111 = 1234321

for i in range(1,int(input())+1):
print(((10**i -1 )//9)**2)

Mod Divmod


문제 : 두개의 정수 a, b가 주어졌을 때 몫과 나머지를 출력하는 문제
입력 : 정수 a; 정수 b
출력 : 몫(a//b); 나머지(a%b); 몫과 나머지(a//b, a%b)

  • INPUT
  • OUTPUT

177
10

17
7
(17, 7)

a = int(input())
b = int(input())

print(a//b)
print(a%b)
print(divmod(a, b))

조금더 짧게

a = divmod(int(input()), int(input()))
print(\*a, a, sep='\n')

Power - Mod Power


문제 : 숫자 a, b, c가 주어졌을 때 a의 b제곱 값과 이를 c로 나눈 나머지를 구하는 문제
입력 : a; b; c
출력 : a의 b제곱; a ** b % c;

  • INPUT
  • OUTPUT

3
4
5

81
1

pow() 함수를 사용하는 매우 간단한 문제

a, b, m = int(input()),int(input()), int(input())
print(pow(a,b),pow(a,b,m),sep='\n')

Integers Come In All Sizes


문제 : 실수 a, b, c, d가 주어졌을 때 a^b + c^d의 값을 구하는 문제
입력 : 실수 a; b; c; d
출력 : ab + cd의 값

  • INPUT
  • OUTPUT

9
29
7
27

4710194409608608369201743232

a, b, c, d = [int(input()) for _ in '1234']
print(a**b + c**d)

Triangle Quest


문제 : 양수 N이 주어졌을 때 1에서 N까지 증가하는 numerical triangle을 출력하는 문제
입력 : N;
출력 : numerical triangle

  • INPUT
  • OUTPUT

5

1
22
333
4444

for i in range(1,int(input())): #More than 2 lines will result in 0 score. Do not leave a blank line also
print((10\**(i)//9)*i)


(PYTHON) pow() vs math.pow()

작성일 2020-03-02 In LANGUAGE 🚀 , PYTHON , TERMINOLOGY 댓글:

Reference

  • Difference between pow() and math.pow()- stackoverflow.com
  • Python pow - journaldev.com
  • 파이썬에서 제곱을 할때요 - edu.groom.io
  • Built-in pow() - Python Documentation
  • Math pow() - Python Documentation

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다


math 모듈을 살펴보다가 기본 내장함수 pow()가 있는데 왜 굳이 math.pow()를 정의해 뒀을까 궁금해서 검색한 내용들을 정리해봤습니다.

짧은 다큐멘터리 Youtube링크 - Powers of Ten™ (1977)를 패러디한 만화입니다

단순한 비교

두 함수의 정의를 봤을 때, 내장함수 pow()에만 augment 하나가 더 옵션으로 들어갈 수 있는 것을 볼 수 있습니다.

pow(base, exp[, mod])
math.pow(x, y)

코드를 작성해서 확인해봐도 둘은 분명히 다른 함수인 것을 알 수 있습니다.


> > > import math
> > > print(pow is math.pow)
> > > False

Built-in pow()

pow(base, exp) 이렇게 2개의 인자(augment)만 주어진다면 밑(base)의 지수(exp)승(또는, base의 exp제곱)한 값을 반환합니다. 반환되는 값의 자료형은 인자들의 자료형을 따라 Integer, Float, Complex number 등으로 결정됩니다.
base ** exp는 pow(base, exp)와 똑같은 기능을 합니다.

 >>> print(pow(10, 2))
100

>>> print(pow(10.0, 2))
100.0

>>> print(pow(2 + 3j, 2))
-5+12j

>>> print(pow(0b11, 2)) # 0b11 = 3
9

>>> print(pow(100.0, 2, 3))
TypeError: pow() 3rd argument not allowed unless all arguments are integers
>>> print(pow(100, -1, 2))
ValueError: pow() 2nd argument cannot be negative when 3rd argument specified

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
1 >>> print(pow(10, 2) % 3)
1

>>> print(pow(0b11, 2, 2)) # 9^2 % 2
1

math.pow()

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

inf = float("inf")
NaN = float("nan")
p = [inf, -inf, NaN, 0.0, -0.0, 0]

for x in p:
print("x is", f'{x:4} /', "pow(1.0, x)=", math.pow(1.0, x), "pow(x, 0.0)=", math.pow(x, 0.0))
x is inf / pow(1.0, x)= 1.0 pow(x, 0.0)= 1.0
x is -inf / pow(1.0, x)= 1.0 pow(x, 0.0)= 1.0
x is nan / pow(1.0, x)= 1.0 pow(x, 0.0)= 1.0
x is 0.0 / pow(1.0, x)= 1.0 pow(x, 0.0)= 1.0
x is -0.0 / pow(1.0, x)= 1.0 pow(x, 0.0)= 1.0
x is 0 / 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)]
for x, y in vals:
print(f"x is {x}, y is {y} /", math.pow(x, y))
x is 1.23, y is 3.33 / 1.9924343529238528
x is -1.23, y is 2.0 / 1.5129
ValueError: math domain error

수행시간 비교

 # executionTime.py written in PyCharm
from timeit import timeit

print('Int ** Int'.ljust(30), timeit('7 ** 5'))
print('pow(Int, Int)'.ljust(30), timeit('pow(7, 5)'))
print('math.pow(Int, Int)'.ljust(30), timeit('math.pow(7, 5)', setup='import math'))
print()
print('float ** float'.ljust(30), timeit('7.0 ** 5.0'))
print('pow(float, float)'.ljust(30), timeit('pow(7.0, 5.0)'))
print('math.pow(float, float)'.ljust(30), timeit('math.pow(7.0, 5.0)', setup='import math'))

** 연산자가 큰 차이로 가장 빠르고 pow()와 math.pow()는 비슷비슷한 시간을 가집니다.

Int \*\* Int 0.012045001
pow(Int, Int) 0.497163934
math.pow(Int, Int) 0.24036590000000002

float ** float 0.012131208999999976
pow(float, float) 0.156296341
math.pow(float, float) 0.21024002100000005

결론

입력되는 인자의 자료형과 상관없이 반환값을 무조건 실수형(float)으로 받고 싶을 때 math.pow() 함수를 사용하는 것이 좋습니다.


> > > timeit('float(i) ** j', setup='i, j = 7, 5')
> > > 0.7610865891750791
> > > timeit('i ** float(j)', setup='i, j = 7, 5')
> > > 0.7930400942188385
> > > timeit('float(i \*\* j)', setup='i, j = 7, 5')
> > > 0.8946636625872202
> > > timeit('math.pow(i, j)', setup='import math; i, j = 7, 5')
> > > 0.5699394063529439

위 코드 결과와 같이, 정수형으로 반환되는 ** 연산(혹은 pow()) 결과를 float() 함수로 형변환 하는 것 보다 math.pow() 함수가 더 빠른 것을 볼 수 있습니다.

특별한 경우가 아니고 간단한 연산에 필요하다면 ** 연산자를 사용하는 것이 가장 좋을 듯 합니다



(PYTHON) Day - 12 Math(1)

작성일 2020-03-02 In LANGUAGE 🚀 , PYTHON , HACKERRANK 댓글:

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python
  • math 모듈 - YUN DAE HEE githubpage

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank

HackerRank의 Python 연습문제들은 아래와 같은 카테고리로 분류 된다

Subdomain - Introduction - Basic Data Types - Strings - Sets - Math - Itertools - Collections - Date and Time - Errors and Exceptions - Classes - Built-Ins - Python Functionals - Regex and Parsing - XML - Closures and Decorators - Numpy - Debugging


Math

Problem

  • Polar Coordinates

기본 개념

수학 관련 Built-in functions

abs(x)
인자 x의 절대값을 반환합니다.


> > > abs(-2)
> > > 2

divmod(a, b)
복소수가 아닌 인자 a, b에 대한 나눗셈의 몫과 나머지를 반환합니다. 즉, 결과값이 (a//b, a%b)와 같습니다.


> > > divmod(5, 3)
> > > (1, 2)
> > > divmod(8.0, 2.0)
> > > (4.0, 0.0)

min(iterable, *[, key, default]) or min(arg1, arg2, *args[, key])
max(iterable, *[, key, default]) or max(arg1, arg2, *args[, key])
각각 최소값, 최대값을 구하는 함수입니다.

def findMax(num):
rem = 0
while(num):
rem = num%10
return rem

# using max(arg1, arg2, \*args, key)

print('Number with max remainder is:', max(11,48,33,17,19, key=findMax))

# using max(iterable, key)

num = [11,48,33,17]
print('Number with max remainder is:', max(num, key=findMax))
Number with max remainder is: 19
Number with max remainder is: 48

sum(iterable, /, start=0)
iterable의 숫자들을 왼쪽부터 차례로 더하여 start의 값에 합한 값을 반환합니다. 즉, 전체합을 반환합니다.


> > > numbers = [2.5, 3, 4, -5]

> > > # start 인자가 생략된 경우
> > >
> > > numbers_sum = sum(numbers)
> > > print(numbers_sum)
> > > 4.5

> > > # start = 10
> > >
> > > numbers_sum = sum(numbers, 10)
> > > print(numbers_sum)
> > > 14.5

pow(base, exp[, mod])
밑(base)의 지수(exp)만큼 거듭제곱한 값을 반환합니다. 옵션으로 mod 인자가 있는 경우 거듭제곱 값을 mod로 나눈 나머지를 반환합니다.


> > > pow(38, -1, mod=97)
> > > 23
> > > 23 \* 38 % 97 == 1
> > > True

round(number[, ndigits])
반올림한 값을 반환합니다.


> > > #ndigits 인자 즉, 소수점 자리를 생략한 경우
> > > round(1)
> > > 1
> > > round(1.4)
> > > 1
> > > round(1.6)
> > > 2

> > > #소수점 자리를 명시한 경우
> > > round(1.343,2)
> > > 1.34
> > > round(1.346,2)
> > > 1.35

Math module

수학적 계산과 관련된 함수들을 제공하는 모듈(복소수는 cmath 모듈이 따로 존재)
내가 사용하는 환경 3.7.6v에서는 50개의 함수가 있다(작성일 기준 최신버전 3.8에서는 55개가 있음)


# test.py written in PyCharm

import math
import sys

s = dir(math)
mod = [n for n in s if not n.startswith('_')]

print('Python 버전:', sys.version)
print()
print('function 개수:', len(mod))
print(mod)
Python 버전: 3.7.6
[Clang 10.0.0 (clang-1000.11.45.5)]

function 개수: 50
['acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']

표현 함수

함수설명
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승
expm1e의 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를 반환
상수 함수
함수설명
ee
piπ
tauτ
inf∞
nanNot a Number

Python 3.8.2 Documentation - Math

**Polar Coordinates**

극좌표계 - 위키피디아


Polar Coordinates


문제 : 복소수를 극좌표로 표현하는 문제
입력 : 복소수 z;
출력 : z를 극좌표에 표현했을 때의 r, ϕ를 출력

r : Distance from to origin, i.e.,
ϕ : Counter clockwise angle measured from the positive -axis to the line segment

  • INPUT
  • OUTPUT
1+2j

2.23606797749979
1.1071487177940904

polar(x) 함수는 abs(x), phase(x) 의 값을 반환한다
즉, 위 그림에서의 r(점까지의 거리), ϕ(위상) 에 해당한다
자세한 설명은 - cmath 모듈

import cmath

z = complex(input())
print(\*cmath.polar(z), sep='\n')


1…91011…33
NUNU

NUNU

개인적으로 공부하면서 정리한 내용들을 블로그에 남기고 있습니다.
99 포스트
18 카테고리
53 태그
RSS
Creative Commons
© 2021 NUNU
Powered by Hexo v3.9.0
|
Theme – NexT.Mist v7.2.0