파이썬 알고리즘 : N개의 최소 공배수

2024년 1월 25일 알고리즘 문제풀이 문제 N개의 최소 공배수 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 def solution(arr): num = max(arr) i = 1 while True: answer = num*i for x in arr: if answer%x: i += 1 break else: return answer 어떤 수들의 최소공배수는 모든 수의 배수라는 의미이다. 따라서 수 들중 가장 큰 수의 배수를 모두 탐색하여 어떤 수로도 나누어 떨어질 때가 최소공배수이다. 가장 큰 수로 하는 이유는, 그나마 횟수를 조금이라도 낮추기 위해서이다.

2024년 1월 29일 · 1 분 · 배준수

파이썬 알고리즘 : 문자열 나누기

2024년 1월 26일 알고리즘 문제풀이 문제 문자열 나누기 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def solution(s): answer = 0 while s: x = s[0] num_x = 0 not_x = 0 for i in range(len(s)): if s[i] == x: num_x += 1 else: not_x += 1 if num_x == not_x: answer += 1 s = s[i+1:] break else: return answer+1 return answer

2024년 1월 26일 · 1 분 · 배준수

파이썬 알고리즘 : 정수 제곱근 판별

2024년 1월 25일 알고리즘 문제풀이 문제 정수 제곱근 판별 난이도 Lv.1 코드 1 2 3 4 5 6 7 def solution(n): tmp = int(n**(0.5)) if tmp**2 == n: answer = (tmp+1)**2 else: answer = -1 return answer 제곱근은 0.5제곱과 같음.

2024년 1월 25일 · 1 분 · 배준수

2.1 네트워크 애플리케이션의 원리

네트워크 애플리케이션 : 다른 위치의 종단 시스템에서 동작하고 네트워크를 통해 서로 통신하는 프로그램 웹 애플리케이션에는 서버와 클라어인트라는 두 가지 프로그램이 있다. 클라이언트 : 사용자의 호스트에서 실행되는 브라우저 프로그램 웹 서버 호스트에서 실행되는 웹 서버 프로그램 새로운 애플리케이션을 개발할 때, 라우터나 링크 계층 스위치처럼 네트워크 코어 장비에서 실행되는 소프트웨어까지 작성할 필요는 없다. 네트워크 코어 장비는 애플리케이션 계층에서 기능하지 않는 대신 네트워크 계층 및 그 하위 계층에서 기능한다. 종단 시스템에서만 애플리케이션 소프,트웨어가 존재한다. 2.1.1 네트워크 애플리케이션 구조 애플리케이션 구조는 네트워크 구조(ex. 1.5장에 나온 프로토콜 스택)와 다르다. 개발자 관점에서 네트워크 구조 : 고정되어 있고 해당 애플리케이션에 특정 서비스 집합을 제공 애플리케이션 구조(application architecture) : 개발자가 설계하며 애플리케이션이 다양한 종단 시스템에서 어떻게 조직되어야 하는지를 알려줌. 최근 가장 많이 사용하는 애플리케이션 구조가 현대 네트워크 애플리케이션에서 사용되는 “클라이언트-서버” 구조와 P2P 구조 클라이언트-서버 구조(client-server architecture) 서버(server) : 항상 동작하고 있는 호스트 클라이언트(client) : 서버에 서비스 요청을 보냄 이 구조에서, 클라이언트는 서로 직접적으로 통신하지 않는다. 서버는 고정 IP 주소를 갖는다. 클라이언트의 요청이 많을 경우 단일 서버 호스트가 모든 요청을 처리하긴 힘들다. 많은 수의 호스트를 갖춘 **데이터 센터(data center)**가 강력한 가상의 서버를 생성하는 역할을 함. P2P 구조 항상 켜져있는 인프라스트럭처 서버에 최소로 의존하거나 의존하지 않음 대신 **피어(peer)**라는 간헐적으로 연결된 호스트 쌍이 서로 직접 통신 피어(peer) : 서비스 제공자(service provider)가 소유하지 않고 사용자들이 제어하는 데스크톱과 랩톱 한 엔드시스템이 서버 역할을 해준다. 토렌트가 대표적인 P2P 구조 P2P구조는 **자가 확장성(self-scalability)**이 있다. 각 피어들이 파일을 요구함으로써 작업 부하를 만들어낸다. 하지만 파일을 다른 피어들에게 분배함으로써 그 시스템에 서비스 능력을 추가함. 토렌트에서 다운로드 받고 업로딩하는 사람이 많을 수록 그 파일은 다운로드 속도가 빨라지는데, 이유가 바로 이것이다. 서버 인프라스트럭처와 서버 대역폭이 필요하지 않아 비용 효율적이다. 보안, 성능, 신뢰성이 단점이다. 2.1.2 프로세스 간 통신 운영체제 용어에서 실제 통신하는 것은 프로그램이 아니라 **프로세스(process)**다. 프로세스(process) 종단 시스템에서 실행되는 프로그램 통신 프로세스가 같은 종단 시스템에서 실행될 때 그들은 서로 프로세스 간에 통신한다. 프로세스 간의 통신을 위한 규칙은 종단 시스템의 운영체제에 의해 좌우된다. 여기서 다룰 통신은 같은 호스트에서 프로세스가 통신하는 방법이 아닌, 다른 호스트에서 실행되어 통신할 때이다. 2개의 종단 시스템에서 프로세스는 컴퓨터 네트워크를 통한 메시지(message) 교환으로 통신한다. 송신 프로세스 : 메시지를 만들어서 네트워크를 보낸다. 수신 프로세스 : 메시지를 받고 역으로 메시지를 보내 응답한다. 클라이언트와 서버 프로세스 네트워크 애플리케이션 : 서로 메시지를 보내는 두 프로세스로 구성 ...

2024년 1월 24일 · 5 분 · 배준수

파이썬 알고리즘 : JadenCase 문자열 만들기

2024년 1월 22일 알고리즘 문제풀이 문제 JadenCase 문자열 만들기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 def solution(s): arr = [' '] + list(s) nums = ['1','2','3','4','5','6','7','8','9','0',' '] n = len(arr) for i in range(1,n): if arr[i-1] == ' ' and arr[i] not in nums: arr[i] = arr[i].upper() elif arr[i].isupper(): arr[i] = arr[i].lower() answer = ''.join(arr[1:]) return answer 단어의 가장 앞이 알파벳일 때, 대문자로 만들어줘야 한다. 처음엔 단어별로 끊어서 풀어보려 했지만 문제의 조건 상 연속된 공백문자가 나올 수 있어서 실패했다. 따라서 모든 글자를 잘게 쪼개서 공백문자 이후 알파벳이 나온다면, 단어의 시작인 알파벳이므로 대문자로 바꾸도록 했다. 그 외의 대문자가 나타날 경우 소문자로 바꿔주는 로직도 추가했다.

2024년 1월 22일 · 1 분 · 배준수

파이썬 알고리즘 : 키패드 누르기

2024년 1월 19일 알고리즘 문제풀이 문제 키패드 누르기 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 def solution(numbers, hand): arr = [0 for _ in range(len(numbers))] position = [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2],[3,0],False,[3,2]] finger = [10,12] left = [1,4,7] right = [3,6,9] for i in range(len(numbers)): num = numbers[i] if num in left: arr[i] = 'L' finger[0] = num elif num in right: arr[i] = 'R' finger[1] = num else: number_position = position[num] left_finger = position[finger[0]] right_finger = position[finger[1]] distance_left = abs(number_position[0]-left_finger[0]) + abs(number_position[1]-left_finger[1]) distance_right = abs(number_position[0]-right_finger[0]) + abs(number_position[1]-right_finger[1]) if distance_left < distance_right: arr[i] = 'L' finger[0] = num elif distance_left > distance_right: arr[i] = 'R' finger[1] = num else: if hand == 'left': arr[i] = 'L' finger[0] = num else: arr[i] = 'R' finger[1] = num answer = "".join(arr) return answer 각 번호간의 거리를 어떻게 처리할지 고민하다가 키패드를 좌표라고 생각하고 각 숫자의 위치를 값으로 갖는 배열 position을 만들었다. ...

2024년 1월 19일 · 2 분 · 배준수

파이썬 알고리즘 : 자연수 뒤집어 배열로 만들기

2024년 1월 18일 알고리즘 문제풀이 문제 자연수 뒤집어 배열로 만들기 난이도 Lv. 1 코드 1 2 3 4 5 def solution(n): answer = list(str(n)) answer.reverse() answer = list(map(int,answer)) return answer reverse와 map 함수의 형식이 은근히 헷갈린다.

2024년 1월 18일 · 1 분 · 배준수

1.6 공격받는 네트워크

1.6 공격받는 네트워크 나쁜 친구들은 인터넷을 통해 여러분의 호스트에 멀웨어(악성코드)를 침투시킬 수 있다 장치를 데이터를 수신/송신 하기 위해 인터넷에 연결하면, 좋은 것과 함께 malware(멀웨어)라는 해로운 것도 전달된다. 파일 삭제, 주민번호, 비밀번호, ekystroke(키스트로크: 키보드 입력) 등의 사적인 정보를 모으는 스파이웨어를 설치하여 인터넷으로 전송한다. botnet(봇넷) : 면역되지 않은 장치들 수 천개로 구성된 네트워크 봇넷은 스팸 전자메일 분배나 분산 Dos(denial of servie) 공격에 이용된다. 나쁜 친구들은 서버와 네트워크 인프라스트럭처를 공격할 수 있다 Dos(Denial-Of-Service) 공격 : 네트워크, 호스트 혹은 다른 인프라스트럭처의 요소들을 정상적인 사용자가 사용할 수 없게 하는 것 웹 서버, 전자메일 서버, DNS 서버, 기관 네트워크가 공격 대상이 될 수 있다. 인터넷 Dos 공격의 세 가지 범주 취약성 공격(vulnerabilty attack) : 목표 호스트에서 공격받기 쉬운 애플리케이션 혹은 운영체제에 메시지를 보냄 대역폭 플러딩(bandwidth flooding) : 목표 호스트로 수많은 패킷을 보내 정당한 패킷들이 도달하지 못하도록 함 연결 플러딩(connection flooding) : 목표 호스트에 반열림(half-open) 혹은 전열림(fully open)된 TCP 연결을 설정하여 가짜 연결을 처리하느라 정상적인 연결을 못 받도록 만든다. 대역폭 플러딩은 서버가 가진 접속 속도보다 높은 트래픽을 전송하면 된다. 트래픽을 하나의 소스에서 방사하면 공격을 차단할 수 있기 때문에 봇넷을 이용한다. 나쁜 친구들은 패킷을 탐지할 수 있다 packet sniffer(패킷 스니퍼) : 지나가는 모든 패킷의 사본을 기록하는 수동적인 수신자 패킷 스니퍼는 채널에 패킷을 추가하지 않아 탐지가 어렵다. 암호화를 통해 방지할 수 있다. 나쁜 친구들은 여러분이 신뢰하는 사람인 것처럼 위장할 수 있다 IP spoofing(IP 스푸핑) : 출발지 주소, 패킷 내용, 목적지 주소를 가짜로 작성하여 인터넷에 보내는 것. 출발지를 바꾸면 다른 사용자인 척을 할 수 있다.

2024년 1월 17일 · 2 분 · 배준수

1.5 프로토콜 계층과 서비스 모델

1.5 프로토콜 계층과 서비스 모델 1.5.1 계층구조 프로토콜 계층화 네트워크 설계자는 프로토콜을 **layer(계층)**로 조직한다. 각 프로토콜은 한 계층에 속한다. 한 계층은 상위 계층에 **서비스(service)**를 제공한다. 이것을 계층의 **서비스 모델(service model)**이라고 한다. 각 계층은 그 계층 내부에서 어떤 동작을 수행하거나, 직접 하위 계층의 서비스를 사용한다. 프로토콜 계층은 소프트웨어, 하드웨어 또는 둘의 통합으로 나타낼 수 있다. 애플리케이션 계층(HTTP, SMTP)과 트랜스포트 계층 : end system의 소프트웨어로 구현 물리(physical) 계층과 데이터 링크 계층 : 네트워크 인터페이스 카드(이더넷, 와이파이 인터페이스 카드) 네트워크 계층 : 하드웨어와 소프트웨어로 혼합 구현 n계층 프로토콜은 네트워크를 구성하는 종단 시스템, 패킷 스위치, 그 외의 요소 사이에 분산되있다. ⇒ 각 네트워크 구성요소에는 하나의 n계층 프로토콜이 있다. 프로토콜 스택 : 다양한 계층의 프로토콜을 모두 합한 것 이 프로토콜 스택에서 애플리케이션 계층부터 다루어 내려가는 것이 top-down approach. 5개 계층의 인터넷 프로토콜 스택 애플리케이션 트랜스포트 네트워크 링크 물리 애플리케이션 계층 네트워크 애플리케이션과 애플리케이션 계층 프로토콜이 있는 곳 HTTP(웹 문서 요청과 전송 제공), SMTP(전자메일 전송 제공), FTP(두 종단 시스템 간의 파일 전송 제공) 같은 프로토콜들을 포함 이 계층에 있는 DNS(Domain Name Server)가 우리에게 친근한 인터넷 주소를 32비트 네트워크 주소로 변환한다. 애플리케이션 계층 프로토콜 : 여러 end system에 분산. 한 end system에 있는 app이 다른 end system에 있는 app과 **메시지(정보 패킷)**를 교환하는데 사용 트랜스포트 계층 클라이언트와 서버 간에 애플리케이션 계층 메시지를 전송 인터넷에는 TCP와 UDP 라는 트랜스포트 프로토콜이 있다. TCP : 연결지향형 서비스. UDP : 비연결형 서비스. 간단한 서비스. 세그먼트(segment) : 트랜스포트 계층 패킷 네트워크 계층 한 호스트에서 다른 호스트로 **datagram(데이터그램)**을 라우팅한다. 인터넷 트랜스포트 계층 프로토콜이 보낸 트랜스포트 계층 세그먼트와 목적지 주소를 목적지 호스트의 트랜스포트 계층으로 전달 IP 프로토콜 IP 데이터그램의 필드를 정의 종단 시스템과 라우터가 이 필드에 어떻게 동작하는지를 정의 네트워크 계층을 가진 모든 인터넷 요소는 IP 프로토콜을 수행해야만 한다. 인터넷 네트워크 계층은 출발지와 목적지 사이에서 데이터그램이 이동하는 경로를 결정하는 라우팅 프로토콜을 포함한다(많이). IP 계층이라고도 불린다. 링크 계층 인터넷의 네트워크 계층은 출발지와 목적지 간 일련의 패킷 스위치(인터넷에서는 라우터)를 통해 데이터그램을 라우트한다. 노드에서 노드로 패킷을 이동하기 위해 네트워크 계층은 링크 계층 서비스에 의존한다. 노드 간의 이동 과정 출발 노드의 네트워크 계층이 데이터그램을 아래 링크 계층으로 보냄 링크 계층은 데이터그램을 경로상의 다음 노드에 전달 다음 노드의 링크 계층은 데이터그램을 상위 네트워크 계층으로 보냄 링크 계층에서 제공하는 서비스는 그 링크에서 채용된 특정 링크 계층 프로토콜에 의해 결정 데이터그램은 경로상의 각기 다른 링크에서 다른 링크 계층 프로토콜에 의해 처리될 수 있다. 프레임(frame) : 링크 계층 패킷 물리 계층 링크 계층의 기능은 전체 프레임을 한 네트워크 요소에서 이웃 네트워크 요소로 이동하는 것 물리 계층의 기능은 프레임 내부의 각 비트를 한 노드에서 다음 노드로 이동하는 것 1.5.2 캡슐화(encapsulation) 호스트 : 다섯 계층을 구현 링크 계층 스위치 : 하위 1~2 계층 구현(물리, 링크) ⇒ IP 주소를 인식 못하지만 이더넷 주소는 인식하는 이유다. 라우터 : 하위 1~3 계층 구현(물리, 링크, 네트워크) 각 계층에서 패킷은 헤더 필드와 **페이로드 필드(payload field)**로 구성된다. 계층 캡슐화 헤더 필드 페이로드 필드 애플리케이션 애플리케이션 계층 메시지 애플리케이션 계층 메시지 트랜스포트 트랜스포트 계층 세그먼트 트랜스포트 계층 헤더 정보 애플리케이션 계층 메시지 네트워크 네트워크 계층 데이터그램 네트워크가 추가한 헤더 애플리케이션 계층 메시지 트랜스포트 계층 헤더 정보 링크 링크 계층 프레임 링크가 추가한 헤더 애플리케이션 계층 메시지 트랜스포트 계층 헤더 정보 네트워크가 추가한 헤더

2024년 1월 16일 · 3 분 · 배준수

파이썬 알고리즘 : 행렬의 곱셈

2024년 1월 16일 알고리즘 문제풀이 문제 행렬의 곱셈 난이도 Lv. 2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 def solution(arr1, arr2): a1 = len(arr1) b1 = len(arr1[0]) a2 = len(arr2) b2 = len(arr2[0]) answer = [[0 for _ in range(b2)] for _ in range(a1)] for i in range(a1): for j in range(b2): tmp = 0 for x in range(b1): tmp += (arr1[i][x]*arr2[x][j]) answer[i][j] = tmp return answer 마지막 tmp를 구할때 b1이나 a2나 아무거나 사용해도 상관없다. 행렬의 곱셈이 가능하다는 건 두 수가 같다는 의미이기 때문이다.

2024년 1월 16일 · 1 분 · 배준수