이름, 초입 값, 어디에 선언 변수 이름! mx(max), mn(min), sm(sum), cnt(counts)… 손코딩 이름 너무 길면 치기 힘들어
# 예약어 쓰지 말기
sum = 0
# ... a = sum(1,2)
# TypeError: 'int' object is not callable
# 예약어가 날아가고 숫자로 대체됨
# 나눗셈 연산 주의
a = -11/2 # -5.5
b = -11//2 # -6 (몫만 남으므로)
c = -11%2 # 나머지는 1
d,e = divmod(-11,2) # 나머지는 언제나 양수: 몫 -6, 나머지 1
f = int(-11/2) # a,b,c,d,e,f int: 버림이므로 -5
# float 소숫점 자리 정해서 출력
x=12345.123456
y=500
print(x,y)
print(f'x:{x:.3f}, y:{y}')2차원 격자 pp 프린트
시간 복잡도
루프 O(n), 2중: O(n²) 10의 8승이 기준 n² - 10000 (10의 4승) n^3 - 100 (10의 3승도 안 됨) 그러니까 루프 많이 도는 거는 안된다 쉬울수록 잘 따져봐야
공간 복잡도
stack + heap = 10의 6승 기준
1000 * 1000 (int) 넘어가면 곤란
테이블이 너무 커지거나 많이 생기면 위험
Float, set, dict은 훨씬 많이 들고.
물고기가 공간복잡도, 지형이 아니라 객체 접근 (N이 10000이상이므로)
나무 자르는 게 2*10의 9승 루프 연산
Testcase.ac - 엣지케이스 찾아줌
꿀팁!!!! 연속 길이 세거나 할 때 자꾸 미래를 보지 말 것. K+1 백만장자 13680_어디에_단어가 → 그냥 다른 게 나오면, 예를 들어 1110001010 → 연속된 길이를 누적 하는 값을 1 일 때 체크하지 말고 0이 나오면 체크할 것
if nxt == ‘X’ or ’.’: = 항상 참!!!! 주의 또 주의
if nxt =='x' or nxt == '.' 이라고 변수 이름 두 번 적어야
문제 조건 나오면 적용 좀 잘 시키자
b19532 문제처럼 나와야 하는 답 범위가 정해져 있으면 그거 꼭 넣자
데이터 다 만든 후 검사
데이터 만들면 멋대로 바꾸지 말기 특히 i, j 그리고 루프 안에서 결과 보지 말기
shift + f9
N^2을 NlogN으로: 힙, 이진탐색, 반의 반의… 로 가는거
객체 메모리 행 보면 offset으로 상대 위치 바로, 다 같은 리스트
다른 사람 코드 많이 보기
엣지케이스
최대, 최소, 0, 꽉 찬거, 없는거, 수 다 같은거, 음수 보여주기는 오름차순, 테케는 반대 등등… 표현에서 있는 엣지 ex) 수가 작은 노드부터 방문 선입견, 함정 - 제약조건 없는데 그럴거라 생각 ex) 시작과 끝이 같다
나누기
맘대로 나누지 말기, //이런거 조건 없으면 쓰지 말기 대신 미리 곱하기, 곱하기 자꾸 부르지 말고 머리에다가 곱하기 해두고 불러다 쓰기 코드리뷰… 조끔의 유인책…
BFS/DFS
BFS: 상태 쉐어함, 멀티타스킹 느낌 갈 때마다 방문 처리하니까, 어디로 가든 최단거리(가중치 없을 때) 그래프 아니라도 최소
DFS: 상태 쉐어 안 함, 예를 들어 3개의 주사위를 겹치지 않게 던진다 - 한 노드 정해지면 깊이 들어가기
n 퀸: n개의 퀸 서로 공격 안 당하게 둘 수 있는 경우의 수
퀸 하나하나 놔 보기 → DFS BFS로 하면 1행에 퀸을 다 놓아보고 시작 → 어디에도 퀸을 놓을 수가 없어, 각각 다 다른 시나리오가 한 상태에 겹친다
백트래킹
아직 유효한지 따지기