Python BOJ insight
백준 온라인 저지 문제풀이 중 알게된 것들, 문법, 실수한 것들 정리하기
- 
어떠한 단어에서 특정 문자가 있는지 위치를 찾을 때
'word'.find('r')'word'.index('r')을 사용한다. 차이점은 find는 찾고싶은 문자가 없으면 -1을 출력하고, index는 오류가 출력된다.
 
- 
input()합수는 str을 받는 함수이다. 숫자를 넣어도 str 
- 
input()대신sys.stdin.readline()사용하는 이유 반복문으로 여러 줄을 입력받는 상황에서는 반드시sys.stdin.readline()을 사용해야 시간초과가 발생하지 않는다.※ readline()은 앞 뒤에 개행문자가 포함된다. 앞 뒤 공백을 제거하기 위해 뒤에 추가로
.strip()을 적어주자.띄어쓰기로 값을 구분해야 할때는 sys.stdin.readline()
.split()을 사용한다.주피터에서는
sys.stdin.readline()작동하지않는다.input()으로 풀고 제출시에만 사용하자 
- 
특정 단어의 개수를 셀 때
word = 'ljes=njak'에서 'nj'의 개수를 찾으려면word.count('nj')를 치면된다. 
- 
10의자리, 1의자리 문제 몫(
//), 나머지(%)이용해서 풀기A // B 를 써야할 것 같은 문제
math.ceil(A/B)고려할 것. 
- 40.0 같은 실수에서 소수점 아래까지 나타내고 싶으면 포맷팅을 사용하자. 
value = "%.3f" % 40.0 
- print()는 기본적으로 출력 이후에 줄 바꿈을 수행한다. 줄 바꿈을 원치 않는 경우 'end' 속성을 이용할 수 있다.
 
- 
리스트에서
list.count( * )하면 *값의 개수를 찾아준다. - 
집합(set)는 중복된 원소를 가지지 않기에 list를 set로 바꿨다가 다시 list로 바꾸면 중복이 제거된다!
 
- 
정렬1 :
sorted(list())정렬2 :
list().sort()1번은 새로운 리스트가 만들어지고, 2번은 기존의 리스트를 정렬시켜서 대체시킨다.
 - 
정렬에서 값이 리스트일 때, 정렬 중요도 설정
A.sort(key = lambda x : x[1])2번째 원소로 정렬 후 1번째 원소로 정렬?
A.sort(key = lambda x : (x[1], x[0]))2번째 원소로 내림차순 정렬 후 1번째 원소로 오름차순 정렬?
A.sort(key = lambda x : (-x[1], x[0])) 
- 
list 맨 마지막 수를 없앨 때
list.remove(list[-1])하면 탐색 후 제거.del list[-1]하면 맨 뒤를 바로 제거! 
- 리스트를 복사하고 싶을 때라고 하면 참조가 된다. 복사만 하려면 슬라이싱을 이용하자.
A = [1, 2, 3] temp = A
temp = A[:]
 
- 
N x M 의 이중 배열을 만들고 싶을 때 리스트 컴프리헨션 이용.
좋은 예시 :
arr = [ [0]*m for _ in range(n)]잘못된 예시 :
arr = [ [0]*m ] * n<-- 전체 리스트 안에 포함된 각 리스트가 모두 같은 객체로 인식 된다. 
- 리스트에 홀수만 담고싶을 때, 
arr = [ i for i in range(20) if i%2 == 1]이렇게 조건도 달아줄 수 있다. 
- 리스트 관련 메서드
 
    
    
- 람다 표현식을 이용하면 함수를 간단하게 작성할 수 있다.
- 특정한 기능을 수행하는 함수를 한 줄에 작성할 수 있다는 점이 특징이다.
 
 
def add(a, b):
    return a+b
# 일반적인 add() 메서드 사용
print(add(3, 7))
# 람다 표현식으로 구현한 add() 메서드
print((lambda a, b : a + b)(3, 7))
- 파이썬의 딕셔너리는 해시테이블을 이용하므로 데이터 조회, 수정에 있어서 O(1)의 시간에 처리가 가능하다.
 
- 
Python의
andA and B 에서, A가 거짓일 경우, B는 보지않고 거짓인 A를 출력. False를 리턴해주지 않는다.
A and B 에서 A가 참이다? B는 확인하지 않고 그냥 B를 출력해준다. 참이면 참인대로, 거짓이면 거짓인대로
 
- 
Python의
or둘 중에 하나만 참이어도 참이기에 A or B 에서 A가 참일경우 B는 확인하지않고 그냥 A를 출력한다.마찬가지로 A가 거짓인경우 B를 확인안하고 바로 리턴해준다.
결국 파이썬에선 거짓일 때 False가 아니라 거짓인 값 자체를 반환해준다.
 
- 
1 == 1 and 2이렇게하면 2가 나오고(1==1) and (1==2)이렇게 하면 False가 나온다.논리연산자는 각각의 요소마다 써주어야 한다!
 
- 
'C' == 'A' or 'C' == 'B' or 'C' == 'C'0 or 0 or 1 => 1 => True
 - 
'C' == ('A' or 'B' or 'C')'C' == (1 or 1 or 1) => 'C' == 1 => False
 - 
'C' == 'A' or 'B' or 'C'False or 'B' or 'C'에서 'B'는 바로 참으로 인식, 'B'를 출력
 
- 
in 연산자와 not in 연산자
리스트, 튜플, 문자열, 딕셔너리 모두 사용 가능
x in 리스트 : 리스트 안에 x가 들어가 있을 때 참(True)
x not in 문자열 : 문자열 안에 x가 들어가 있지 않을 때 참(True)
 
count = 0
def A(~):
    count += 1
A(~)
이렇게 해도 count 는 증가하지않는다. 함수안의 count는 지역변수기 때문이다.
Class stack():
    ~~~~~
    ~~~~~
이런 클래스가 있다면 st = stack 이 아니라 st = stack() 이렇게 해줘야 인스턴스가 생성됨.
st = stack 을 하면 st가 stack 클래스의 기능을 한다.(별명)
- 
내장 함수 :
기본 입출력 함수부터 정렬 함수까지 기본적인 함수들을 제공한다.
파이썬 프로그램을 작성할 때 없어서는 안되는 필수적인 기능을 포함하고 있다.
 - 
itertools :
파이썬에서 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공한다.
특히 순열과 조합 라이브러리는 코딩 테스트에서 자주 사용된다.
 - 
heapq :
힙(Heap) 자료구조를 제공한다.
일반적으로 우선순위 큐 기능을 구현하기 위해 사용된다.
 - 
bisect :
이진 탐색(Binary Search) 기능을 제공한다.
 - 
collections :
덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함한다.
 - 
math :
필수적인 수학적 기능을 제공한다.
팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함한다.
 
- 시간복잡도 생각하며 알고리즘 짤 것
 
- 주피터 
ctrl+/누르면 그 줄 주석처리! 
- 소수 / 에라토스테네스의 채 공부해볼 것. 구현
 
- 
for i in range(n)에서 맨 끝 1개를 덜 포함해서 종종 런타임에러가 일어났다. 주의 
- 
while stack and i<N:이거 하니까 인덱스 오류가 안났다. (백준 # 17298 오큰수)내가 했던건
while i<N:차이점 ??