이름, 초입 값, 어디에 선언 변수 이름! 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 - 엣지케이스 찾아줌

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행에 퀸을 다 놓아보고 시작 어디에도 퀸을 놓을 수가 없어, 각각 다 다른 시나리오가 한 상태에 겹친다

백트래킹

아직 유효한지 따지기

반복: 딕셔너리로 관리해보자