알고리즘/알고리즘 정리

알고리즘 그 외(구현, 시뮬레이션 풀이 팁) 개인적인 기록

에멜라 2023. 2. 14. 20:32

구현, 시뮬레이션은 쉬워보임에도 불구하고 코드로 구현하기는 복잡한 것들이 많은 유형이다.
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은 홀수)
ex2) 리스트 안에 모든 원소가 동일한가 (level 2 - 혼자서 하는 틱택토)
# 가로 줄 동일
for row in board :
    if all([m == obj for m in row]) :
        return True