HTTP의 비연결성(Connectionless)과 비상태성(Stateless)을 보완하여 서버가 클라이언트를 식별하기 위해 사용합니다.
HTTP는 서버의 자원을 절약하기 위해 모든 사용자의 요청마다 연결과 해제의 과정을 거치기 때문에 연결 상태를 유지하지 않고(비연결성), 연결 해체 후에도 상태 정보를 저장하지 않습니다.(비상태성) → 사용자를 식별할 수 없어 매번 새로운 사용자로 인식하게 됩니다. ex) 페이지를 이동할 때마다 로그인을 다시 해야 됨.
+ 비연결성(Connectionless) : 클라이언트가 요청(request) 한 후 응답(response)을 받으면 연결을 끊는다
+ 비상태성(Stateless) : 통신이 끝나면 상태를 유지하지 않는다.
▶쿠키와 세션의 차이 -> 저장 위치, 보안, 속도
가장 큰 차이점은 정보의 저장 위치입니다. 쿠키는 클라이언트에, 세션은 서버에 저장됩니다.
보안면에서는 세션이 더 우수하며, 요청 속도는 쿠키가 세션보다 더 빠릅니다. 그 이유는 세션은 서버의 처리가 필요하기 때문입니다.
쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 스니핑 당할 우려가 있어 보안에 취약하지만 세션은 쿠키를 이용하여 sessionid만 저장하고 그것으로 구분해서 서버에서 처리하기 때문에 비교적 보안성이 좋습니다.
쿠키와 세션은 비슷한 역할을 하며 동작 원리도 비슷합니다. 그 이유는 세션도 쿠키를 사용하기 때문입니다.
+ 세션을 사용하면 좋은데 왜 쿠키를 사용하는가?
-> 세션은 서버의 자원을 사용하기 때문에 사용자가 많을 경우 소모되는 자원이 상당합니다. 때문에 자원관리 차원에서 쿠키와 세션을 적절히 사용하여 서버 자원의 낭비를 방지하고 속도를 높일 수 있습니다.
▶ 쿠키(Cookie)
쿠키란
클라이언트(브라우저) 로컬에 저장되는 Key와 Value로 구성된 String형태의 작은 데이터 파일
쿠키의 구성요소 : 이름, 값, 유효시간, 도메인, 경로
세션 관리 : 로그인, 접속 시간, 장바구니 등 서버가 알아야 할 정보들을 저장
개인화 : 사용자마다 다르게 그 사람에 적절한 페이지를 보여줄 수 있다.
트래킹 : 사용자의 행동과 패턴을 분석하고 기록한다
쿠키 사용 예
-> 사용자 편의를 위한 것, 지워져도 되고, 가로채이더라도 큰 지장이 없는 수준의 정보
쇼핑몰의 장바구니 기능
ID 저장, 자동 로그인
자동 완성, 팝업창 일주일간 다시 보지 않기
최근 검색한 상품들을 광고에서 추천
▶ 세션(Session)
세션이란
세션은 쿠키를 기반으로 하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리합니다.
각 클라이언트에게 고유 세션 ID를 부여한다.
보안면에서 쿠키보다 우수하다. -> 사용자에 대한 정보를 서버에 두기 때문에
사용자가 많아질수록 서버 메모리를 많이 차지하게 된다
동접자 수가 많은 웹 사이트의 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이 됩니다.
표현(Layer 6) : 공통된 표현 형식으로 데이터를 변환하거나, 암호화, 압축을 수행한다.
세션(Layer 5) : 데이터의 동기화를 위해 일정한 길이마다 sync를 삽입하여 전송 계층으로 데이터를 전달한다.
전송(Layer 4) : 발신지와 목적지의 주소를 지정하고, 연결 방식, 흐름제어, 오류제어를 한다. 그리고, 데이터를 전송할 수 있는 세그먼트 단위로 나눈다.
네트워크(Layer 3) : 발신지와 목적지의 주소가 아닌 라우팅에 필요한 논리 주소를 설정하고, 패킷에 대한 라우팅 정보를 삽입한다.
데이터링크(Layer 2) : 프레인 단위로 데이터를 나눈다. 그리고 MAC 주소를 지정하고, 각 양 끝단의 속도차이에 대해 원활하게 해주기 위한 흐름제어를 한다. 또한 데이터의 오류를 막기 위해 CRC방법이나 체크썸 방식을 사용해 데이터를 받는 쪽에서 데이터의 오류를 검사할 수 있도록 설정한다.
물리계층(Layer 1) : 전송 매체가 일반 케이블인지, 광 케이블인지 등의 설정을 한다. 그리고 전송 방식과 데이터를 회선으로 보내기 위한 전기적인 변환을 담당한다.
def solution(n):
answer = 0
for i in range(1,n+1):
if n%i == 0:
answer+=i
return answer
# 행렬의 덧셈
def solution(arr1, arr2):
answer = [[] for i in range(len(arr1))]
for i in range(len(arr1)):
for j in range(len(arr1[i])):
answer[i].append(arr1[i][j]+arr2[i][j])
return answer
def solution(n):
answer = 0
for num in range(2,n+1):
count = 0
for i in range(2,num):
if num%i == 0:
count+=1
if count == 0:
answer+=1
return answer
시간초과 2) 제곱근 사용하기 -> 테케 정확도 11 / 효율성 1,2,3,4 탈
'N의 약수는 무조건 sqrt(N) 범위에 존재한다' 를 적용
def solution(n):
answer = 0
for num in range(2,n+1):
count = 0
for i in range(2,int(num**(0.5))+1):
if num%i == 0:
count+=1
if count == 0:
answer+=1
return answer
성공 ) 에라토스테네스의 체 사용
소수(x)의 배수는 약수로 무조건 x를 포함하게 된다. 따라서 절대 소수의 배수는 소수가 될 수 없다. 이를 이용한 것이 에라토스테네스의 체이다. 누구나 알고있는 가장 작은 소수인 2부터 시작해서, 2의 배수를 다 지웠으면, 지워지지 않은 수 중에서 다음 값인 3의 배수를 지워나가고 이를 계속해서 반복해 나가면 소수만 남게된다. 마치 체에 걸러서 남는 것들만 뽑아내는 방식이라고 생각하면 된다.
def solution(n):
answer = 0
n += 1 # for문 사용을 위한 n += 1
prime = [True] * n # n개의 [True]가 있는 리스트 생성
for i in range(2, int(n**0.5)+1): # n의 제곱근까지만 검사
if prime[i]: # prime[i]가 True일때
for j in range(2*i, n, i): # prime 내 i의 배수들을 False로 변환
prime[j] = False
for i in range(n): # 소수 카운팅
if i > 1 and prime[i] == True:
answer+=1
return answer
+ (GOOD) 풀이 set을 사용한 에라토스테네스의 체
2~n까지의 수를 함수 num에 담기
2~int(n**0.5)+1까지의 수 i 에 대해, i 가 num 안에 있으면, i의 배수set(i의 2배수 부터 n까지수 중 i 만큼 간격있는 수들)를 num에서 빼주기
나머지 num의 길이 리턴
def solution(n):
num=set(range(2,n+1))
for i in range(2,int(n**0.5)+1):
if i in num:
num-=set(range(2*i,n+1,i))
return len(num)
게임개발자인 "죠르디"는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다. "죠르디"는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.
게임 화면은"1 x 1"크기의 칸들로 이루어진"N x N"크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 "5 x 5" 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다.게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1번, 5번, 3번] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다.
만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 위 상태에서 이어서 [5번] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형두 개가 없어집니다.
크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. (그림에서는 화면표시 제약으로 5칸만으로 표현하였음)
게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.
[ 제한사항 ]
board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
0은 빈 칸을 나타냅니다.
1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
moves 배열의 크기는 1 이상 1,000 이하입니다.
moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.
[ 입출력 예 ]
내 풀이
딕셔너리를 사용해서 크레인 번호 별로 board 배열 재구성
0이 아닌 값만 저장
크레인 위치(moves) 순서대로 바구니에 쌓기
new_board 에 값이 있다면 바구니에 넣고 new_board에서 값 제거
터진 후 바구니 구하기
바구니에 아무것도 없다면 pang에 넣어주고
있다면 pang의 마지막 원소와 바구니 원소를 비교하여 같지 않다면 pang에 추가
같다면 pang에 넣은 원소 삭제
터트린 인형 갯수 세기(result)
바구니에 쌓은 원소 개수 - 터진 후 바구니 원소 개수
※ 실패1) 테케 1 실패
-> 인형 터트린 후 결과 구할 때, 맨 앞 원소가 다 터져 원소가 남아있지 않은 경우를 고려하지 않고 pang의 마지막 원소를 가져와 비교하도록 했다 ex) basket = [1,1,2,3,5,4] 일 경우
-> pang의 길이를 확인하고 0이면 그냥 더해주도록 수정
내 코드
from collections import defaultdict
def solution(board, moves):
answer = 0
# board 배열 재구성
new_board = defaultdict(list)
for i in board:
for key, value in enumerate(i):
if value !=0:
new_board[key+1].append(value)
# print(new_board)
# moves 순서대로 바구니에 쌓기
basket = []
for i in moves:
if len(new_board[i]) != 0:
basket.append(new_board[i][0])
new_board[i].pop(0)
# print(basket)
# 인형 터트린 후 결과
pang = []
for i in range(len(basket)):
if len(pang)==0:
pang.append(basket[i])
else:
if pang[-1] != basket[i]:
pang.append(basket[i])
elif pang[-1] == basket[i]:
pang.pop(-1)
# 터트린 인형의 갯수
answer = len(basket) - len(pang)
# print(pang)
return answer
+ 다른 풀이
def solution(board, moves):
stacklist = []
answer = 0
for i in moves:
for j in range(len(board)):
if board[j][i-1] != 0:
stacklist.append(board[j][i-1])
board[j][i-1] = 0
if len(stacklist) > 1:
if stacklist[-1] == stacklist[-2]:
stacklist.pop(-1)
stacklist.pop(-1)
answer += 2
break
return answer