최재영의 개발 일지
GitHubLinkedIn

전체 글

[PS] 덱(Deque)

deque는 양쪽 끝에서 O(1)으로 삽입/삭제가 가능한 자료구조이다. 내부적으로 이중 연결 리스트 기반으로 구현되어 있다. 반면에 인덱스로 접근하면 O(n)이다. 그래서 인덱스 접근이 잦다면 list가 더 유리하다. 주요 메서드

[PS] 무한대

양의 무한대: `float('inf') 음의 무한대: `float('-inf')

[PS] 연산자

1. 산술 연산자 # +, -, *, /, //, %, ** 10 // 3 # 3 -10 // 3 # -4 10 % 3 # 1 -10 % 3 # 2 2 ** 10 # 1024 자주 쓰는 패턴 # 1) 중간값 (파이썬은 bigint라 오버플로우 걱정 없음) mid = (left + right) // 2 # 2) 올림 나눗셈 (m

[PS] 큐(Queue)

collections.deque를 큐로 사용한다. deque는 양 끝에 삽입/삭제가 O(1)이기 때문이다. from collections import deque queue = deque() # 삽입 queue.append(1) queue.append(2) queue.append(3) # deque([1, 2, 3]) # 꺼내기 val = queue.p

[PS] 스택(Stack)

list를 스택으로 사용할 수 있다. stack = [] # push stack.append(1) stack.append(2) stack.append(3) # stack = [1, 2, 3] # pop top = stack.pop() # top = 3, stack = [1, 2] # top top = stack[-1] # top = 2 # empty

[PS] 입력(input)

기본 input()은 항상 문자열을 반환한다. s = input() n = int(input()) x = float(input()) 빠른 입력 sys.stdin.readline() input()은 느리다. sys.stdin.readline()을 사용하면 입력을 빠르게 받을 수 있다. import sys input = sys.stdin.readline 주의:

[PS] 출력(print)

기본 출력 a, b = 1, 2 print(a, b, sep=',', end='') # "1,2" arr = [1, 2, 3, 4, 5] print(arr) # [1, 2, 3, 4, 5] print(*arr) # 언패킹: "1 2 3 4 5" 빠른 출력 sys.stdout.write()

[Docs] 비밀번호 저장 방식의 역사

Spring Security - Password Storage History 처음에는 비밀번호를 평문으로 저장했다. 저장된 비밀번호에 접근하려면 열쇠가 있어야 하므로 안전하다고 생각했다. 하지만 악의적인 사용자들이 데이터베이스를 통째로 훔쳐가기 시작했고, 평문으로 된 정보는 공공재가 되어버렸다. 보안 전문가들은 비밀번호를 보호하기 위해 무언가를 더 해야 할

Cloudflare 네임서버 사용하기

배경 난 hosting.kr에서 도메인을 구매했다. 그리고 DNS 레코드 관리 설정에서 CNAME으로 내 도메인을 DuckDNS와 연결했다. 문제는 hosting.kr에서 루트 도메인은 CNAME을 허용하지 않는다는 것이다. 예전에 AWS Elastic IP를 사용할 때는 ip 주소를 입력하면 돼서 루트 도메인도 사용할 수 있었는데, 이 경우에는 안 되는

Caddy로 리버스 프록시 구성하기

배경 개인 서버를 그대로 네트워크에 노출하는 것은 위험하기 때문에 하나 더 남은 데스크탑으로 VPS 역할을 하는 리버스 프록시를 만드려고 했다. 여기에도 웹 서버를 띄워야 하는데, Caddy가 간편하면서도 인증서도 자동으로 설정해준다고 해서 Caddy를 사용해보기로 했다. 또한, Caddy는 로컬 환경에 설치하지 않고 도커로 띄우기로 했다. 디렉토리 구조