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의
and
A 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:
차이점 ??