개인정보 수집 유효기간
오늘 날짜와 개인정보 수집 날짜의 총 일수 차이를 구하고
terms의 유효개월 역시 일수로 바꾸어 둘의 차이를 비교하면 되는 문제.
def solution(today, terms, privacies):
answer = []
# 오늘 날짜를 리스트 형태로 저장, [2022, 5, 19]
today_lst = list(map(int, today.split('.')))
# terms를 딕셔너리로 변환, 개월수를 *28 해서 일수로 변경
terms_dict = {t.split()[0]: int(t.split()[1]) * 28 for t in terms}
문자열 형태의 오늘 날짜를 년, 월, 일로 나누어 리스트 형태로 저장함. 나중에 인자끼리 비교할 때 사용.
terms_dict라는 딕셔너리를 만들어 각 약관(알파벳)에 해당하는 유효 일수를 저장.
for i in range(len(privacies)):
date, key = privacies[i].split()
# 오늘 날짜 리스트와 같은 형태로 date_lst를 구성, [yyyy, mm, dd]
date_lst = list(map(int, date.split('.')))
year = (today_lst[0] - date_lst[0]) * 336
month = (today_lst[1] - date_lst[1]) * 28
day = (today_lst[2] - date_lst[2])
# 년의 차이, 개월의 차이, 일의 차이를 구한 뒤 총 일수를 total_days에 저장
total_days = year + month + day
# terms_dict에서 주어진 유효일수가 total_days보다 작다면 유효기간 지난 것
if terms_dict[key] <= total_days:
answer.append(i+1)
date와 key에 각각 날짜와 약관을 저장. 이때 약관은 terms_dict의 키 값을 나타내기 때문에 변수명을 key로 설정.
date변수를 date_lst로 변환. 아까 오늘 날짜를 년, 월, 일로 나누었던 것과 동일한 구조.
today_lst와 date_lst의 년, 월, 일의 차이를 구한 뒤 전부 다 일수로 바꿔줌. 한달이 28일이라는 조건이므로 년, 월 차이에 각각 336과 28을 곱해주면 된다.
total_days에 총 일수의 차이를 저장.
만약 해당 약관의 유효일수가 이 total_days보다 작다면 유효기간이 지난 것이므로 결과 리스트에 append.
# 개인정보 수집 유효기간
# terms를 딕셔너리로 변환, 이때 개월 -> 일
# 오늘 날짜와 개인정보 수집 날짜의 차이를 구함(일 단위)
# 이 차이를 terms 딕셔너리의 유효일수과 비교하여 더 크면 폐기
def solution(today, terms, privacies):
answer = []
# 오늘 날짜를 리스트 형태로 저장, [2022, 5, 19]
today_lst = list(map(int, today.split('.')))
# terms를 딕셔너리로 변환, 개월수를 *28 해서 일수로 변경
terms_dict = {t.split()[0]: int(t.split()[1]) * 28 for t in terms}
for i in range(len(privacies)):
date, key = privacies[i].split()
# 오늘 날짜 리스트와 같은 형태로 date_lst를 구성, [yyyy, mm, dd]
date_lst = list(map(int, date.split('.')))
year = (today_lst[0] - date_lst[0]) * 336
month = (today_lst[1] - date_lst[1]) * 28
day = (today_lst[2] - date_lst[2])
# 년의 차이, 개월의 차이, 일의 차이를 구한 뒤 총 일수를 total_days에 저장
total_days = year + month + day
# terms_dict에서 주어진 유효일수가 total_days보다 작다면 유효기간 지난 것
if terms_dict[key] <= total_days:
answer.append(i+1)
return answer
최종 코드
TCP
전송 제어 프로토콜(Transmission Control Protocol)
삼중 핸드셰이크(Three-Way Handshake)
클라이언트가 서버에 SYN 패킷을 보냄. "연결을 시작하고 싶어."
서버는 클라이언트의 요청을 받아 SYN-ACK 패킷으로 응답. "연결을 받아들일게."
클라이언트는 서버의 응답을 확인 후 ACK 패킷을 보내 연결을 확립. "연결 확립."
데이터 전송 & 패킷 손실과 재전송
클라이언트는 데이터를 여러 개의 패킷으로 나누어 전송. "너한테 1~9번으로 나누어진 데이터 전송할게."
서버는 누락된 세그먼트의 순서 번호를 포함한 ACK 패킷을 클라이언트에게 전송. "응 받았는데 9번이 안왔어. 다시 줘."
클라이언트는 누락된 패킷을 재전송. "응 다시 보낼게"
TCP는 이런 과정을 거치는 연결 지향적인 프로토콜.
장점
- 신뢰성 있는 데이터 전송이 가능.
- 연결 지향적 통신으로 데이터의 순서가 보장됨.
- 송신자와 수신자의 데이터 속도를 조절하여 오버플로우를 방지함.
단점
- 전송 속도가 느림.
- 연결 설정 및 종료 과정이 필요해 초기 지연이 발생.
사용 예시
신뢰성이 중요한 애플리케이션에서 주로 사용.
- 웹 브라우징(HTTP/HTTPS)
- 이메일
- 파일 전송
UDP
데이터 전송
데이터를 데이터그램 단위로 전송. 각 데이터그램은 독립적으로 전송되며, 다른 데이터그램과의 관계 또한 없다.
UDP는 비연결형 프로토콜이기 때문에 삼중 핸드셰이크 따위는 없음. 일방향적.
"응 받았는데 9번이 안왔어. 다시 줘." -> "응 다시 보낼게" 이런 과정 자체가 없음. 없으면 없는대로.
속도는 빠르지만 이러한 과정에서 데이터 중간중간이 비어있을 수 있음, 즉 패킷 손실이 있을 수 있다.
장점
- 전송 속도가 빠름.
- 헤더가 간단하여 오버헤드가 적음.
단점
- 신뢰성이 없음. 즉, 데이터가 손실되거나 순서가 뒤바뀔 수 있음.
- 네트워크 혼잡 시 전송 속도 조절 불가능.
사용 예시
신뢰성보다는 속도가 중요한 애플리케이션에서 사용.
- 실시간 음성 통화
- 동영상 스트리밍
- 온라인 게임
TCP/IP 4계층
1. 네트워크 인터페이스 계층 (Network Interface Layer)
- 역할: 물리적 네트워크 매체를 통해 실제 데이터를 전송합니다. 데이터 링크 계층과 물리 계층의 기능을 포함합니다.
- 주요 기능: 프레임의 포장과 해제, 물리적 전송 매체를 통한 비트 전송.
- 예시: 이더넷, 와이파이, ARP(Address Resolution Protocol).
2. 인터넷 계층 (Internet Layer)
- 역할: 데이터그램을 소스 호스트에서 목적지 호스트까지 전달합니다. 라우팅과 논리적 주소(IP 주소)를 사용하여 데이터를 전송합니다.
- 주요 기능: 라우팅, IP 주소 할당, 패킷 전송.
- 예시: IP(Internet Protocol), ICMP(Internet Control Message Protocol), IGMP(Internet Group Management Protocol).
3. 전송 계층 (Transport Layer)
- 역할: 종단 간(end-to-end) 통신을 제공하고, 데이터의 전송을 신뢰성 있게 보장합니다. 두 호스트 간의 데이터 전송을 담당합니다.
- 주요 기능: 데이터 전송의 신뢰성 보장(TCP), 비연결형 데이터 전송(UDP).
- 예시: TCP(Transmission Control Protocol), UDP(User Datagram Protocol).
4. 응용 계층 (Application Layer)
- 역할: 사용자에게 네트워크 서비스를 제공합니다. 응용 프로그램이 직접 네트워크와 상호작용하는 계층입니다.
- 주요 기능: 데이터 형식 변환, 통신 프로토콜 정의, 사용자 인터페이스 제공.
- 예시: HTTP(Hypertext Transfer Protocol), FTP(File Transfer Protocol), SMTP(Simple Mail Transfer Protocol), DNS(Domain Name System).
오늘의 회고
뭔가 정처기 공부 다시하는 느낌. 이론으로 들어가니까 조금 재미없긴 하다.
그래도 주말에 쉬어서 그런지 수업도 집중해서 듣고 복습도 어느정도 마무리했다.
내일의 목표는 코드카타, CS 특강 후 복습하기
'매일 TIL' 카테고리의 다른 글
[내일배움캠프 6-4일] 신고 결과 받기, SQL 1주차 (0) | 2024.08.01 |
---|---|
[내일배움캠프 6-2일] 코드카타, RVC 음성합성 AI(1) (0) | 2024.07.30 |
[내일배움캠프 5-5일] 코드카타, 객체지향 프로그래밍, SW 개발 방법론 (0) | 2024.07.26 |
[내일배움캠프 5-4일] 코드카타 문제, CS 특강, 스쿼드 문제 (0) | 2024.07.25 |
[내일배움캠프 5-3일] 동적 계획법, 유기농 배추 리뷰 (2) | 2024.07.24 |