‘하루 3분 네트워크 교실(아미노 에이지, 김현주, 영진닷컴)’ 참조

1) 라우터의 기능

  • (1) 네트워크와 네트워크의 경계상에 배치
    • 라우터는 복수의 인터페이스를 가질 수 있음
    • 인터페이스에는 논리 주소인 IP 주소가 설정되어 있으므로 라우터의 각 인터페이스는 각각의 네트워크에 소속되어 있는 형태임
  • (2) 라우팅
    • 데이터그램의 수신처 IP 주소를 근거로 다음에 송신하는 라우터를 결정함
  • (3) 복수의 네트워크끼리 연결
    • 라우터는 네트워크 경계선상에 있기 때문에 복수의 네트워크끼리 연결하는 역할을 함
  • (4) 필터링
    • 데이터그램에 대해 조건을 붙여 해당 데이터그램을 파기하는 필터링(Filtering) 기능을 수행함

2) 라우터의 동작

  • (라우팅 테이블) 라우터가 수신한 패킷이 수신처까지 도달하기 위한 최적의 경로가 설정되어 있음
    • (구성) 수신처 네트워크, 다음에 도달할 라우터, 그 라우터에 연결되어 있는 자신의 인터페이스, 수신처 네트워크까지 거리
  • (최장일치의 룰) 라우팅 테이블에서 다음 수신처를 찾아내는 방식
    • 수신처 IP 주소의 비트열라우팅 테이블의 수신처 네트워크 주소 비트열을 앞에서부터 비교하여 가장 많이 일치하는 것부터 선택

‘하루 3분 네트워크 교실(아미노 에이지, 김현주, 영진닷컴)’ 참조

1) IP 주소와 MAC 주소

  • (인터넷 작업) ‘네트워크 간의 데이터 전송’을 말하며 IP 주소로 위치를 결정하는 작업을 ‘어드레싱, 경로를 결정하는 작업을 ‘라우팅’이라고 함
  • (MAC주소와 IP 주소) 일반적으로 데이터는 여러 네트워크 경로를 거쳐 최종 수신처에 도달하는데, MAC 주소는 ‘다음 수신처’를 결정하며, IP 주소는 ‘최종 수신처’를 지정함

2) 경로

  • (경로 설정 과정) MAC 주소로 ‘다음 수신처'를 결정하고, IP 주소로 ‘최종 수신처'를 지정하는 방식으로 최종 수신처까지의 경로가 만들어짐
  • (라우터) 최종 수신처 까지 부분 경로를 지정하는 역할을 담당
  • (홉 바이 홉) 라우터가 다음 수신처를 결정하는 과정이 반복되어 최종 수신처까지의 경로가 설정되는 방식
  • (라우팅 규칙) 라우터가 라우팅함으로써 다른 네트워크에 대한 경로가 생성되는데, 경로가 없으면 다른 네트워크에 데이터그램을 보낼 수 없음

‘하루 3분 네트워크 교실(아미노 에이지, 김현주, 영진닷컴)’ 참조

1) 수신처 IP 주소 파악

  • (IP 주소를 알고 있는 경우) IP 주소를 수동으로 입력해서 데이터를 전송할 수 있음
  • (IP 주소를 모르는 경우) 도메인 명(Domain Name)을 이용하여 수신처의 IP 주소 파악

2) DNS

  • (도메인 명) 송신할 상대의 컴퓨터 이름
    • (예시) ‘http://’ 뒤에 오는 문자열
    • (특징) 다른 컴퓨터와 구별하기 위해 유일한 이름이어야 함
    • (관리 주체) 도메인 명은 IP 주소와 마찬가지로 ICANN이 관리함
  • (DNS) 도메인 명과 IP 주소를 대응시킨 시스템을 DNS(Domain Name System)이라고 함
    • (DNS 서버) 이름과 IP 주소의 대응 데이터베이스를 갖고 있는 DNS 서버에 문의하여 IP 주소를 입수
    • (DNS 서버 관리 주체) DNS 서버는 각 조직에 1개씩 있으며 그 조직의 도메인 명만 관리함
    • (IP 주소 입수 과정)
      • 사용자 애플리케이션은 도메인 명으로 수신처를 지정함
      • 자체 DNS 서버에 해당 도메인 명에 대응하는 IP 주소를 문의함
      • 자체 DNS 서버는 다른 조직의 DNS 서버에 다시 문의함
      • 자체 DNS 서버는 다른 조직의 DNS 서버로부터 입수한 IP 주소를 사용자 어플리케이션에 전달함

3) 데이터 전송 흐름

  • (송수신처 주소 결정) DHCP, ARP, DNS를 사용하여 4개의 주소 결정
    • (송신처 MAC 주소) NIC를 장치하여 자동으로 파악
    • (송신처 IP 주소) 수동으로 입력하거나 또는 DHCP에서 자동으로 할당 받음
    • (수신처 IP 주소) 사용자 애플리케이션이 수신처의 도메인 명을 결정하면 DNS로 IP 주소를 취득함
    • (수신처 MAC 주소) IP주소가 결정된 후 ARP에 의해 MAC 주소를 취득함

‘하루 3분 네트워크 교실(아미노 에이지, 김현주, 영진닷컴)’ 참조

1) 주소해결 프로토콜

  • (주소해결 프로토콜) ARP(Adress Resolution Protocol)라고 하며, 데이터를 보내려는 IP 주소의 MAC를 요청하는 프로토콜을 말함

2) ARP 테이블과 ARP

  • (ARP 테이블) IP주소와 MAC 주소의 대응표를 말하며 데이터를 전송하려는 컴퓨터는 수신처의 IP 주소를 결정하고, 수신처 MAC 주소를 알기 위해서 ARP 테이블을 참조
  • (ARP 요청) ARP 테이블에 수신처 IP 주소에 대응하는 MAC 주소가 없을 경우, 브로드캐스트로 네트워크 내 모든 컴퓨터에 MAC 주소를 요청하는 작업
  • (ARP 응답) ARP 요청을 받은 컴퓨터 중 지정된 IP주소를 갖는 컴퓨터만 MAC 주소를 응답하는 과정
  • (ARP 파기) 인터페이스 고장 등으로 MAC 주소가 변경되는 경우를 대비하여 일정 시간(ex. 300초)이 지나면 ARP 테이블을 파기함

25. DHCP

1) 송신처의 IP 주소와 MAC 주소

  • (이더넷을 사용한 데이터그램 송수신) 이더넷을 사용해서 IP 데이터그램을 송수신하기 위해서는 4개의 주소(’ 수신처 MAC 주소’, ‘송신처 MAC 주소', ‘수신처 IP 주소', ‘송신처 IP 주소')가 필요함
  • (MAC 주소 설정 방법) 송신처 MAC 주소의 경우 송신할 인터페이스의 MAC 주소를 사용
  • (IP주소 설정방법) 정적 방법 및 동적 방법
    • (정적) 수동으로 IP 주소를 설정하는 방법으로, 네트워크 관리자가 정한 IP 주소를 자신의 컴퓨터에 입력
    • (동적) IP 주소가 자동으로 컴퓨터에 설정되는 방법으로 DHCP(Dynamic Host Configuration Protocol)라고 하는 프로토콜을 사용함

2) DHCP

  • (DHCP) 할당할 IP 주소를 관리하고, 실제로 할당 작업을 수행하는 서버(Server)와 할당을 받는 클라이언트(Client)로 이뤄짐
  • (IP 주소 풀) 관리자가 할당할 IP 주소의 범위로, 서버는 IP주소 풀 중에서 유일한 주소를 요청한 클라이언트에 할당
  • (대여 기간) 서버는 IP 주소를 할당할 때, 대여 기간을 설정하고, 클라이언트 측이 계속해서 사용하고 싶으면 기간 연장을 요청함
  • (DHCP 메시지) DHCP 메시지에는 주소옵션 설정 등의 정보를 가짐
  • (옵션) 메세지 타입 및 클라이언트 설정(서브넷 마스크, 디폴트게이트웨이, DNS 서버 주소, 대여 기간 등)

‘하루 3분 네트워크 교실(아미노 에이지, 김현주, 영진닷컴)’ 참조

 

1. 서브네팅

1) 네트워크 분할

  • (배경) 호스트 번호를 체계적으로 분류하기 위해 네트워크를 계층에 따라 구분할 필요성 존재
  • (서브네트워크) 하나의 네트워크 안에서 분할된 작은 네트워크를 서브네트워크(Subnetwork)라고 함
  • (서브넷 번호) 호스트 번호의 일부를 줄여서 서브넷 주소를 만드므로 ‘호스트 번호 = 서브넷 번호 + 호스트 번호’로 구성됨
  • (서브넷 특징)
    • 서브넷은 해당 네트워크 내부에서만 유효함
    • 서브넷화 하는 것을 ‘서브네팅’이라고 함
    • 서브넷 비트 수를 크게 하면 최대 서브넷 수는 증가하고 최대 호스트 수는 감소함

 

2) 서브넷마스크

  • (서브네팅의 문제점) 네트워크 관리자가 임의로 서브넷 주소를 할당하므로 IP주소 중 어디까지가 네트워크 주소인지 구분하지 못하는 문제 발생
  • (서브넷마스크)
    • (용도) IP주소 중 어디까지가 서브넷 번호인지 나타내는 목적
    • (내용) 네트워크 번호 및 서브넷 번호의 비트를 모두 1로, 호스트 번호를 0으로 표기함
    • (특징) 서브넷마스크의 비트가 1인 부분이 네트워크 번호며, IP주소와 서브넷마스크는 반드시 세트로 표기함

 

2. 클래스리스 어드레싱

1) 클래스풀 어드레싱의 문제점

  • (클래스풀 어드레싱의 문제점) 클래스의 크기를 3개로만 구분하기 때문에 사용되지 않는 IP의 주소가 증가함.
    • (예시) 2,000개의 IP주소가 필요한 기관의 경우,
      • C클래스의 IP주소(256개)는 부족하기 때문에,
      • B클래스(IP주소 65,000개)를 할당받는데,
      • 63,000개(65,000 - 2,000개)의 IP주소는 사용되지 않는 문제점 발생

 

2) 클래스리스 어드레싱

  • (클래스리스 어드레싱) 클래스라는 구분을 없애고 필요한 IP주소의 개수에 따라 네트워크 번호를 결정하는 방식
  • (슈퍼넷) 클래스풀 어드레싱에 따라 할당된 네트워크를 통합하여 하나의 네트워크로 구성하는 것을 슈퍼넷(Super Network)라고 함
    • (예시) 2,000개의 IP주소가 필요한 기관의 경우,
      • 클래스 C 네트워크(IP주소 256개) 8개를 통합하여 하나의 네트워크로 구성함
      • 이때 제 1옥텟부터 제3옥텟까지 24비트를 모두 네트워크 주소로 사용하는 것이 아니라,
      • 21비트만 네트워크 주소로 할당하고, 나머지 11비트를 호스트 번호로 사용하게 되면,
      • 총 2,048개의 호스트에게 IP를 부여할 수 있으므로 목적에 맞는 네트워크 운용이 가능함
  • (프리픽스 길이)
    • (클래스리스 어드레싱의 문제점) 클래스풀 네트워크와 마찬가지로 IP 주소 중 어디까지가 네트워크 번호의 비트인지 구분하지 못하는 문제점 발생
    • (Prefix-Length) 네트워크 번호의 길이를 나타내는 값을 의미함
    • (해결책) IP주소 뒤에 슬래시를 넣고 프리픽스 길이를 씀으로써 네트워크 번호의 영역을 나타냄
      • (예시) 192.168.32.0 / 21

1. 문제 - 카카오 18년 기출 3번

  • 지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.
    • 이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.
    • 어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다.
    • 어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.
  • 입력 형식
    • 캐시 크기(cacheSize)와 도시 이름 배열(cities)을 입력받는다.
    • cacheSize는 정수이며, 범위는 0 ≦ cacheSize ≦ 30이다.
    • cities는 도시 이름으로 이뤄진 문자열 배열로, 최대 도시 수는 100,000개이다.
    • 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다. 도시 이름은 최대 20자로 이루어져 있다.
  • 출력 형식
    • 입력된 도시 이름 배열을 순서대로 처리할 때, "총 실행시간"을 출력한다.
  • 조건
    • 캐시 교체 알고리즘은 LRU(Least Recently Used)를 사용한다.
    • cache hit일 경우 실행시간은 1이다.
    • cache miss일 경우 실행시간은 5이다.

image

 

2. 풀이 - 데크(Deque) 이용

1) 데크 자료형 구현

일반적으로 이중 연결 리스트로 구현된 데크(Deque) 자료형은 동적 배열로 이뤄진 파이썬 리스트보다 시간 효율성이 우수하다.

또한, deque 자료형은 매개변수 ‘maxlen’을 설정할 수 있어서 본 문제를 구현하는 데 적합하다.

예를 들어 캐시 사이즈(=maxlen)는 3이며 ‘a’, ‘b’, ‘c’, ‘d’가 차례대로 입력될 때,

데크에는 ‘a’, ‘b’, ‘c’가 우선 삽입되며, 최종적으로 ‘a’가 빠짐과 동시에 ‘d’가 삽입된다.

 

 

import collections

def solution(cacheSize, cities):

    cache = collections.deque(maxlen=cacheSize)

 

2) 캐시 히트

입력값으로 주어진 도시가 캐시에 이미 존재할 경우(캐시 히트), 실행시간(answer)에 1을 추가한다.

다만 캐시가 LRU로 구현되었기 때문에, 가장 오래전에서 사용된 캐시 값이 우선적으로 제거된다는 점을 주의해야 한다.

즉, 캐시 히트가 발생할 경우 해당 값은 데크의 가장 우측으로 위치 변경을 해야 한다.

아래 코드에서 remove() 함수를 이용하여 해당 값을 데크에서 제거한 후, append() 함수로 다시 추가하는 방식으로 구현했다.

 

 

import collections

def solution(cacheSize, cities):

    answer = 0
    cache collecdtions.deque(maxlen=cacheSize)

    for c in cities:

        # 소문자 처리
        c = c.lower()

        # 캐시 히트
        if c in cache:
            cache.remove(c)
            cache.append(c)

            answer += 1

 

3) 캐시 미스

입력값으로 주어진 도시가 캐시에 존재하지 않을 경우(캐시 미스), 실행 시간(answer)은 5만큼 증가한다.

캐시 미스가 일어난 도시는 새로이 캐시에 추가한다.

앞서 설명한 대로 데크가 가득 찬 상황에서 새로운 값이 추가되면, 가장 오래전에 삽입된 값이 데크에서 우선적으로 제거된다.

전체 코드는 아래와 같다.

 

 

import collections

def solution(cacheSize, cities):
    answer = 0

    cache = collections.deque(maxlen=cacheSize)

    for c in cities:

        # 소문자 처리
        c = c.lower()

        # 1. 캐시 히트
        if c in cache:

            # 캐시 추출 후 재삽입
            cache.remove(c)
            cache.append(c)

            answer += 1

        # 2. 캐시 미스
        else:
            cache.append(c)
            answer += 5


    return answer

 

 

‘파이썬 알고리즘 인터뷰(박상길, 책만)’ 참조

 

1. 문제 - (카카오 18년 기출) - 다트 게임

  • 카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다. 갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.
    • 다트 게임은 총 3번의 기회로 구성된다.
    • 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
    • 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
    • 옵션으로 스타상() , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
    • 스타상()은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
    • 스타상()의 효과는 다른 스타상()의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상() 점수는 4배가 된다. (예제 4번 참고)
    • 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
    • Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
    • 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.
    • 0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.
    스크린샷 2022-07-14 오전 11 11 12

 

2. 풀이 - 문자열 처리

 

1) 정수 처리

 

문자열을 처리하는 문제다.

다트를 던지는 횟수(3번)만큼 덧셈이 이뤄지므로, 총 세개의 점수가 더해지는 셈이다.

리스트를 생성하여 세개의 점수를 삽입하고 sum()함수로 그 답을 구하는 구조로 전체를 구성한다.

 

스크린샷 2022-07-14 오전 11 39 00

 

문자열(dartResult)을 대상으로 for 반복문을 실행하여 개별 문자열 하나하나를 추출한다.

추출한 문자열(s)가 정수일 경우, 미리 만든 리스트(nums)에 해당 문자열의 정수값(int(s))을 입력하는 방식이다.

정수값 앞에 ‘ nums[-1] * 10 ’이 더해진 이유는 10점이 입력값으로 들어오는 경우 때문이다.

다트 점수가 10점일 경우, for문의 문자열 처리 과정에서 각 자리 숫자가 개별적으로(‘1’ → ‘0’) 처리된다.

따라서 일의 자리 수 ‘0’을 처리할 때, 십의 자리수 ‘1’에 대한 자릿수 올림을 계산해야 한다.

 

 

nums = [0]

for s in dartResult:
  if s.isdigit():  # s가 정수일 때
    nums[-1] = nums[-1] * 10 + int(s)

 

2) 연산식 처리

 

거듭제곱 연산(Single, Double, Triple)과 곱셉(스타상 및 아차상)을 처리한다.

거듭제곱 연산은 1제곱, 2제곱, 3제곱을 처리한다.

스타상은 방금 던진 다트의 점수와 이전에 던진 다트의 점수에 ‘2’를 곱하고,

아차상은 방금 던진 다트 점수에 ‘-1’을 곱한다.

리스트에 들어있는 정수 값에 각각의 연산을 적용시키면 된다.

주의할 점으로 스타상의 경우 2차례 시행을 대상으로 ‘x2’처리를 해야하며,(#1)

스타상이 맨 첫 시행에서 발생할 경우에 대한 예외 조건을 설정해야 한다. (#2)

전체 코드는 아래와 같다.

 

 

def solution(dartResult):
    answer = 0

    nums = [0]

    for s in dartResult:
        if s == 'S':
            nums[-1] **= 1
            nums.append(0)

        elif s == 'D':
            nums[-1] **= 2
            nums.append(0)

        elif s == 'T':
            nums[-1] **= 3
            nums.append(0)

        # 1. 이전 값과 그 이전 값 모두 2배 처리    
        elif s == '*':
            nums[-2] *= 2

            #2. 아차상이 맨 처음 시행에서 발생할 경우 
            if len(nums) > 2:
                nums[-3] *= 2

        elif s == '#':
            nums[-2] *= (-1)

        # 자릿수 올림: 입력값으로 10이 들어온 경우, 문자열 '1'과 '0'을 나누어 처리    
        else:
            nums[-1] = nums[-1] * 10 + int(s)


    return sum(nums)

+ Recent posts