HTTPS의 원리를 설명해주세요
HTTPS는 보안된 형태의 HTTP프로토콜로 소켓 통신에서 SSL을 통해 세션 데이터를 암호화합니다. SSL은 서버가 CA를 통해 발급받는 인증서로
HTTPS사용을 위해서는 SSL인증서가 필요합니다
1.서버가 퍼블릭, 프라이빗 키를 생성하고
2.인증서를 발급받기위해 CA에 퍼클릭키 +A를 CA에 전달한다
3.CA에서 SSL인증서를 발급하고
4.CA에서 SSL인증서를 암호화하기 위해 CA의 공개키와 프라이빗키를 생성해서 ca프라이빗 키를 이용해서 SSL인증서를 암호화한다
결국 CA에서 암호화된 SSL인증서
를 서버에 넘겨주는 것
5.주고받을 데이터의 암호화를 위한 동일한 대칭키(데이터를 암호화하는 키)를 얻는다
HTTPS는 SSL을 이용한 HTTP 통신방식입니다. 클라이언트가 서버에 처음 접속 요청을 보내면 서버는 CA에서 발급받은 인증서와 퍼블릭키를 응답합니다. 클라이언트는 CA의 유효성을 확인하고 서버는 먼저 CA에서 인증서를 발급받아 신뢰할 수 있는 서버라는 것을
파일을 생성할 때 사용하는 파이썬 내장함수
f=open(파일 경로, 옵션) #↔ close()
→ 옵션 rwax+tb조합해서 사용
list의 중복을 제거할 때 사용.
set은 순서를 보장하지 않으므로 다시 list로 바꿔도 기존의 순서를 보장할 수 없다
교집합: s1.intersection(s2) == s1&s2
합집합: s1.union(s2) == s1 | s2
차집합: s1.difference(s2) == s1 - s2
교집합이 존재하지 않음: s1.isdisjoint(s2)
부분집합판별: s1.issubset(s2) :s1이 2의 부분집합인지 → T/F반환
대칭차집합: symmetric_difference == s1 ^ s2
add: 하나씩 추가(==list.append)
update: 여러개 추가(==list.extend)
remove: 값이 없으면 에러.
discard: 값이 없어도 에러x.
pop: 실행해보면 집합 맨 앞의 요소를 삭제하지만 set은 순서가 없는 자료형이므로 임의의 요소를 삭제한다고 보는 게 맞음. 빈 셋이면 에러.
clear: 비우기 set.clear()
변수, 상수, 함수 등의 이름. 길이에 제한이 없음
숫자로 시작할 수 없음
특수기호 사용 불가
.py(파이썬의 소스코드)를 읽어서 실행시킬 때 자동으로 생성되는 파일
__pycache__에 저장됨
컴파일 언어: 소스코드→기계어→실행
인터프리터 언어: 바로 실행 (컴파일어보다 느림)
소스코드→기계어 과정을 .pyc로 저장해두고 이후에는 바로 실행할 수 있도록함
수동으로 컴파일하는 방법:
#터미널에서
python -m comileall
#또는
#파일에서
import py_compile
py_compile.compile(파일명)
def solution(arr1, arr2):
ans=[]
for i in range(len(arr1)):
row=[]
for j in range(len(arr1[0])):
row.append(arr1[i][j]+arr2[i][j])
ans.append(row)
return ans
def solution(arr1, arr2):
ans=arr1
for i in range(len(arr1)):
for j in range(len(arr1[0])):
ans[i][j]=arr1[i][j]+arr2[i][j]
return ans
근데 테스트 17이 너무 오래걸려서 for문 중첩을 쓰면 안되는 건가 싶다. 행렬 길이가 500을 넘지 않는다고해서 써도 된다고 생각했는데 아닌가??
def solution(arr1, arr2):
for i in range(len(arr1)):
for j in range(len(arr1[0])):
arr1[i][j]+=arr2[i][j]
return arr1
→ 이게 좀 더 낫긴하지만 그래도 오래 걸린다.. 뭘까
import numpy as np
def sumMatrix(A,B):
A=np.array(A)
B=np.array(B)
answer=A+B
return answer.tolist()
→ 넘파이를 써서 할 수 있다.
행렬로 바꾸고 행렬의 덧셈을 한 다음 다시 리스트로 바꿔서 리턴. 와우와우
def sumMatrix(A,B):
answer = [[A[i][j] + B[i][j] for j in range(len(A[0]))] for i in range(len(A))]
return answer
내가 푼 걸 한줄로 하는 사람두 있다 ㅎㅎㅋㅋㅎㅋㅎㅋ
리스트 축약식 안에 다시 리스트 축약식을 쓴다
def sumMatrix(A,B):
answer = []
for a, b in zip(A, B):
l = []
for x, y in zip(a, b):
l.append(x + y)
answer.append(l)
return answer
# 축약식 버전
def sumMatrix(A,B):
answer = [[c + d for c, d in zip(a, b)] for a, b in zip(A,B)]
return answer
#
def solution(A,B):
return [list(map(sum, zip(*x))) for x in zip(A, B)]
역시 인덱스 없이도 많은 걸 할 수 있다는 걸 다시 한번 깨닫는다.. 인덱스좀 잃자..
→ 처음에 zip으로 짝지어준 두 리스트를 하나의 변수x에 튜플 자체로 담고
그 튜플을 언패킹해서 두 리스트를 zip으로 다시 짝지어주면 다시 튜플에 담기는데 그 튜플을 sum한 것