프로그래밍 117

[도커] 2. 도커 시작하기

이번시간에 도커를 설치하고 실행해보려고 한다. 도커는 기본적으로 리눅스 커널에서 돌아가기 때문에 리눅스가 필요하다.(window를 위한 docker desktop도 나왔다고 한다.) 기존 사용중이던 리눅스는 이미 설치가 돼 있기 때문에 aws ec2 프리티어 인스턴스를 사용하여 진행할 예정이다. 도커를 설치하기 위해 다음 명령어를 입력한다. sudo apt install -y docker.io -y 옵션은 입력하는 부분이 나오면 y를 선택해준다. 도커가 제대로 설치됐는지 확인하는 방법은 버전을 확인하면 된다. docker --version 도커 명령어 중 하나를 실행해보고자 한다. 다음 명령어는 실행중인 컨테이너 목록들을 보여준다. docker ps 권한이 없다는 메시지가 나온다. sudo를 사용해 임시..

[도커] 1. 도커란 무엇인가

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼으로 알려져 있다. 처음에는 이것이 쉽게 와닿지 않았다. 그래서 좀 쉬운 말로 설명하자면 내가 개발한 환경을 이미지 형태로 저장하여 다른 서버에서도 같은 환경으로 애플리케이션을 작동할 수 있도록 해준다. 몇 가지 사용 예시를 들어보자 1. 개발 pc와 배포 pc의 분리 보통 개발은 로컬 pc에서 진행하고 배포는 로컬 또는 클라우드 pc에서 진행한다. 대부분은 개발과 배포를 같은 곳에서 하지 않을 것이다. 버전에 민감한 라이브러리(TF는 1.x와 2.x가 호환되지 않는다!)들은 서로 버전을 맞춰줘야 하는데 이 라이브러리가 많아지면 관리하기 힘들 것이다. nodejs의 package.json이나 python의 anaconda 같은 패키지 관리 기능을 사용하여도 되..

[알고리즘] 알고리즘 문제를 풀 때 알면 좋은것들

알고리즘을 풀며 쌓아온 꿀팁 아닌 꿀팁을 정리하고자 한다. 1. (파이썬) 여러개의 변수 입력받기 # 여러개의 변수 a,b,c = map(int, input().split()) # 1 2 3 # 한줄로 입력받는 리스트 arr = list(map(int, input().split())) # 1 2 3 4 5 6 7 8 9 # 여러줄을 입력받는 리스트 arr = [int(input()) for _ in range(n)] # 1 # 2 # 3 # 4 # 2차원 배열 arr = [list(map(int, input().split())) for _ in range(n)] # 1 2 3 # 4 5 6 # 7 8 9 2. (파이썬) 배열 초기화 # 1차원 배열 a = [0]*n # 2차원 배열 a = [[0]*n f..

[알고리즘] 모듈러 연산과 페르마의 소정리

알고리즘 문제를 풀다 보면 "답이 커질 수 있으니 $1,000,000,007$로 나눈 나머지를 출력하시오" 이런 문장이 많이 보인다. 오늘은 이런 나머지연산에 대한 이야기를 하고자 한다. 피보나치 수 7 15624번: 피보나치 수 7 첫째 줄에 n번째 피보나치 수를 1,000,000,007으로 나눈 나머지를 출력한다. www.acmicpc.net 이 문제를 한번 보자 단순히 문제에서 제시한대로 구현한다면 이런 코드가 나올것이다. n = int(input()) a, b = 0, 1 for i in range(n): a,b = b, a+b print(a%1000000007) 하지만 이렇게 제출하게 되면 시간초과 또는 틀렸습니다를 받는다. 그 이유는 계산 과정에서 a, b의 값이 매우 커지기 때문이다. 이를 ..

[알고리즘] 피보나치 수열의 성질

피보나치 수는 많은 성질을 가지고 있다. 이 포스트에서 소개하고자 한다. 여기서 살펴볼 피보나치수열은 다음과 같다. $F_1 = 1, F_2 = 1, F_n = F_{n-1} + F_{n-2} \ (n\ge3)$ 1. $\sum_{k=1}^n F_k = F_{n+2} - 1$ 정의에 따라 $F_1 = F_3 - F_2$ $F_2 = F_4 - F_3$ ... $F_n = F_{n+2} - F_{n+1}$ 이다. 그럼 식을 다음과 같이 변형할 수 있다. $F_1+F_2+...+F_n$ $= (F_3-F_2)+(F_4-F_3)+...+(F_{n+2}-F_{n+1})$ $= F_{n+2} - F_2$ $= F_{n+2} - 1$ 이를 통해 $\sum_{k=a}^b F_k $ $= \sum_{k=1}^b F_k..

[알고리즘] 분할 정복을 이용한 거듭제곱

이전 글에서 피보나치 수를 구하다가 빠른 거듭제곱이 나와 따로 글로 남기게 되었다. 거듭제곱을 위해 다음 코드를 작성하면 $O(N)$의 시간이 필요하다. def pow(a,n): r = 1 for _ in range(n): r *= a return r 위 코드는 거듭제곱을 $a^n=a^{n-1} \times a$ 방식으로 구한다. 이것을 빠르게 해 보자! $n$이 짝수이면 $a^n = a^{n/2} \times a^{n/2}$ $n$이 홀수이면 $a^n = a^{n/2} \times a^{n/2} \times a$ 가 된다. 이제 이것을 재귀적으로 계산하면 된다. 예를 들어 $3^{60}$을 계산해보자 $3^{60} = 3^{30} \times 3^{30}$ $3^{30} = 3^{15} \times 3..