구현, 시뮬레이션은 쉬워보임에도 불구하고 코드로 구현하기는 복잡한 것들이 많은 유형이다.
python 함수에 대해 기본적으로 많이 알고 있어야 된다거나, 모든 경우의 수를 다 넣어봐야 되는 경우도 있다. 경우의 수가 적은 경우에는 실제로 그렇게 해도 된다.
string 문자열의 경우에는 단순히 문자가 포함되있는지 여부를
s in 'adkakksjaksdkjjkd'
로 찾을 수 있다.
Python)
ord
Character에 대한 ASCII값을 반환
영어의 경우 아스키코드가 다 붙어있기 때문에 ord(e) - ord(a) 하면 e와 a간의 차이가 나옴(대소문자 구분)
chr
ASCII값을 문자로 다시 변환해준다. 유니코드 포함
chr(ord(e)) -> e
.upper(), .lower()
둘다 upper('') 함수는 존재 X -> 전부 메서드 형식으로 써줘야 동작함
.isalpha()
문자열이 알파벳인지
swapcase
대소문자 토글
<비트연산>
1) 2진수 <-> 10진수 변환
bin(_int) : 10진수 숫자를 이진수로 변환 (이때 처음 두 단어는 0b 로 binominal을 나타내는 언어이므로)
bin(_int) 후에 반드시 _str[2:] 를 해주자
int(_bin, 10) : 2진수 숫자를 10진수로 변환
2) 비트연산자
a & b : 비트 and 연산자 -> 두 수가 모두 1인경우 1, 그렇지 않으면 0
a | b : 비트 or 연산자 -> 두 수중 하나라도 1인경우 1, 둘다 0인경우만 0
a ^ b : 비트 xor 연산자 -> 두 수가 같은경우 0, 다른경우 1
~x : 비트 not 연산자 -> 각 자릿수가 1인경우 0으로, 0인경우 1으로 변환
참고 ) 13^10 = 9 : 10진수끼리의 비트연산은 이 값들이 2진수일때 비트연산 후 10진수 변환
'1011'^'10' = 1001 : 자릿수가 서로 다른 비트연산이라도 자릿수를 맞춰준다
참고2)
str 앞에 자릿수 채우기
임의의 수만큼 str 앞에 0을 붙이고 싶을때
str.zfill(n)
길이 8아 맞추어 숫자 개수를 0으로 맞추고싶을때
'{0:08.2f}'.format(150.37) <- 숫자 개수를 8개로 맞춰줌 {0:08 때문에
+ .2f 때문에 소숫점 둘째짜리 까지 나옴
<날짜연산>
파이썬의 날짜연산
0) 단순 'yyyy.mm.dd' 형식으로 동일시
그냥 비교가능 (????왜 되냐) -> 날짜로 인식해서 되는게 아니라 유니코드 순이라 정렬되는듯
1) datetime 라이브러리 활용
date=datetime.strptime(date,'%Y-%m-%d') <- 문자를 날짜 형식으로 변환
이렇게 생성된 date, date1 끼리
date < date1 연산 가능
date+timedelta(days=35) : 35일 뒤 날짜 : timedelta(days/weeks='')
+) 날짜 비교문제의 경우
연 월 일을 모두 일 변환후(ex 1년 = 12*30 일, 1월 = 30일 -> int(yyyy) *12 *30 + int(mm)*30 + int(dd))
하는 방법이 더 깔끔하다.
나의 경우
def compare(list_date, list_date2)
if
if
if
else 문으로 날짜 비교하는 함수를 생성 후 사용했으나 이 방법보다 더 빠르고 깔끔한 방법이 많이 존재한다
else
else
if - continue 문
반복문 내에서만 사용되며, 반복이 진행되는 도중 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복문으로 넘어간다.
컴프리핸션
한줄짜리 if문 한줄짜리 for문
[x for x in range(1, 10+1) if x % 2 == 0]
딕셔너리 컴프리헨션
wn = {i:j for i,j in zip(want,number)}
scores = { name: score for name, score in scores.items() if name != '전학생'}
print(scores)
딕셔너리
dict_.items()
dict_.values()
dict_.keys()
딕셔너리 정렬
sorted(dict_.items(), key = lambda item: item[0], reverse = True)
math.reduce 함수
reduce(집계 함수, 순회 가능한 데이터[, 초기값])
최대공약수 알고리즘
math.gcd(arg*)
두 개의 자연수 a와 b에서(단 a>b) a를 b로 나눈 나머지를 r이라고 했을때 GCD(a, b) = GCD(b, r)과 같고 r이 0이면 그때 b가 최대공약수이다.
zip
zip() 함수는 여러 개의 순회 가능한(iterable) 객체를 인자로 받고, 각 객체가 담고 있는 원소를 터플의 형태로 차례로 접근할 수 있는 반복자(iterator)를 반환
>>> numbers = [1, 2, 3]
>>> letters = ["A", "B", "C"]
>>> for pair in zip(numbers, letters):
... print(pair)
...
(1, 'A')
(2, 'B')
(3, 'C')
zip 을 이용한 행렬의 덧셈
.tolist() np.array <-> python list
numpy의 tolist method는 array를 python의 list로 바꿔줍니다.
왜 써? - 행렬연산(덧셈, 뺄셈, 곱셈, 행렬곱 가능) , 빠르게 계산해준 후 다시 파이썬 리스트로 사용하게 해줌
all()
: 안에 리스트가 모두 True 값을 가지면 True 하나라도 False이면 False 출력
-> 주로 컴프레헨션과 같이 많이 사용한다.
ex) 리스트 안에 모든 원소에 대해서 특정 조건을 만족하는가?
all(num % 2 == 0 for num in [1, 2, 4, 8]) # False (1은 홀수)
# 가로 줄 동일
for row in board :
if all([m == obj for m in row]) :
return True
'알고리즘 > 알고리즘 정리' 카테고리의 다른 글
그리디, 재귀함수 (0) | 2023.02.19 |
---|---|
lru_cache 캐싱을 이용한 dp (0) | 2023.02.19 |
<힙과 우선순위 큐> 개인적 정리 (0) | 2023.02.14 |
<그래프 알고리즘 BFS, DFS, 델타함수> 개인적인 정리 (0) | 2023.02.14 |
union_find, return 없는 def, global 배울점 많은 코드 (0) | 2023.02.14 |