본문 바로가기

반응형

Computer/Coding Test

(33)
파이썬으로 행렬 구현하기 (4) - 마무리 [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (1) [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (2) [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (3) - 가우스 조던 소거법을 이용한 역행렬 지난 포스트들에서 numpy 라이브러리 없이 순수히 파이썬 문법으로만 행렬을 구현해보았습니다. 먼저, 행과 열이 주어지거나 이중 리스트가 들어왔을 때 행렬을 표현할 수 있도록 클래스를 정의했고 이후에 덧셉, 곱셈, 뺄셈, 역행렬 등의 다양한 행렬 연산을 추가하였습니다. 보통 이런 류의 문제를 내는 코딩테스트에서는 여기서 끝나지 않습니다. 구현한 행렬 클래스를 기반으로 행렬을 이용한 다양한 알고리즘 문제를 서브 문제로 출제하는 경우가 보통입니다. 따라..
파이썬으로 행렬 구현하기 (3) - 가우스 조던 소거법을 이용한 역행렬 [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (1) [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (2) 지난 포스트에서의 행렬 덧셈, 뺄셈, 곱셈에 이어 이번 포스트에서는 행렬의 역변환, 역행렬을 구현해보도록 하겠습니다. 행렬의 행과 열의 크기가 같은 정방행렬의 역행렬을 구하는 방법으로는 대표적으로 가우스-조던 소거법이 있습니다. $AX=I$에서 A의 역행렬 $X$를 구하는 가우스-조던 소거법의 기본은 $AX$를 $IX$로 바꿔주기 위해 1) 행렬의 한 행을 상수배, 2) 행렬의 두 행을 바꿈, 3) 한 행을 상수배하여 다른 행에 더하는 기본 행연산을 수행한다는 것입니다. 행렬의 각 행은 일차방정식이라 볼 수 있고 각 일차방정식을 identity matrix에 ..
파이썬으로 행렬 구현하기 (2) [알고리즘 & 코딩테스트/코딩테스트] - 파이썬으로 행렬 구현하기 (1) 이번 포스트에서는 지난 포스트에서 구현한 행렬 클래스를 기반으로 덧셈, 뺄셈, 곱셈 등의 다양한 행렬 연산을 구현해보도록 하겠습니다. 이때 행렬 클래스끼리 더하거나 곱하는 등의 연산이 가능하도록 언더바 두개로 이루어진 magic method (__magic_method__) 함수를 정의하는 방식으로 구현하도록 하겠습니다. 덧셈과 뺄셈 먼저 덧셈을 구현합니다. 주의 사항으로는 더할 두 행렬의 행과 열의 크기가 같아야하고 만약 정수를 더할 때에는 기존 행렬의 행 혹은 열의 크기가 1일 경우 (벡터의 경우) 모든 원소에 정수를 더하고 행, 열의 크기가 모두 1보다 크다면 대각선 원소만 더한다고 가정합니다. 만약 기존 행렬의 행, 열의 크..
파이썬으로 행렬 구현하기 (1) 코딩테스트의 유형은 회사, 지원직무, 경력에 따라 상이합니다. 일반적으로는 특정 사이트에 접속해서 (프로그래머스, 코드업 등) 주어진 문제를 2~3 시간 내에 풀고 제출하는 경우가 대부분이지만 지원하는 직무가 높은 경력을 요구하거나 일반 알고리즘 문제로 직무 적합성을 판단하기 애매한 경우에는 회사에서 직접 문제를 지원자에게 메일로 보내 푼 문제의 소스코드를 압축파일로 보내라는 경우도 많습니다. 이때의 코딩테스트 문제는 완전 운입니다... 지원하는 팀에서 개발하려고 하는 모듈이 될 수도 있고 (개인적으로 최악의 경우로 요구사항이 높습니다) 머신러닝의 경우 직접 알고리즘를 개발하여 주어진 성능을 달성해야 하는 경우도 있습니다. 이번 포스트에서는 그 중에서도 가장 간단한 numpy 등의 외부 라이브러리 없이 ..
KMeans 알고리즘 구현하기 KMeans는 대표적인 군집화 알고리즘으로 간단한 특성으로 인해 온사이트 인터뷰나 코딩 테스트에서 스크래치부터 구현해보라는 문제가 가끔씩 출제됩니다. 이번 포스트에서는 scikit-learn, numpy 같은 외부 라이브러리 없이 파이썬의 내장 함수와 라이브러리만으로 KMeans 알고리즘을 구현해보도록 하겠습니다. 군집화할 데이터는 10000개의 16차원 벡터라 가정하면 16개의 실수 요소를 가진 리스트 10000개를 요소로 가진 리스트가 됩니다. Utility functions Euclidean distance Distance metric으로 Euclidean distance를 계산하는 함수를 구현합니다. 입력으로 같은 길이의 리스트 2개를 받고 각 요소 별 차이의 제곱을 모두 더한 후 math 라이브..
코딩테스트 문제 (28) - 정렬 리스트 병합하기 문제 여러 개의 정렬된 리스트를 1개의 정렬된 리스트로 병합하는 문제입니다. a = [[1,4,5],[1,3,4],[2,6]] => [1,1,2,3,4,4,5,6] 풀이 이 문제는 우선순위 큐를 사용해 풀 수 있는 문제로 파이썬에서 heapq 모듈을 사용하면 됩니다. 파이썬의 heapq 모듈은 최소힙이 구현된 것으로 리스트 원소를 heappush 메소드로 넣고 heappop 메소드로 리스트를 추출할때 이미 정렬되어 있으므로 맨 앞의 원소를 뽑아내고 다시 heap 구조에 집어 넣습니다. from heapq import heappush, heappop def solution(ListofList): result = [] heap = [] for i, l in enumerate(ListofList): heapp..
코딩테스트 문제 (27) - 리스트에서 부분집합 출력하기 입력으로 숫자가 담긴 리스트가 주어졌을 때 리스트의 모든 부분집합을 출력하는 문제입니다. 지난 포스트에서는 깊이우선탐색으로 (DFS) 풀었지만 간단한 비트 연산자로 해결할 수 있습니다. 비트 연산자란 정수를 2진수로 표현하여 각 비트끼리 연산하는 operator 를 말하는데요, 파이썬에서의 비트 연산자는 비트를 $n$ 칸 만큼 왼쪽으로 옮기는 "> n" 의 두 가지가 존재합니다. 예를 들어 "1
코딩테스트 문제 (26) - 최대 공약수, 최소 공배수 이번 포스트에서는 최소공약수, 최대공배수를 구하는 방법을 알아보겠습니다. 최대 공약수 최대 공약수는 2개의 자연수를 각각 나누어서 나머지가 0이 되는 최대 자연수를 말합니다. 간단하게 2개의 자연수를 받아 2부터 작은 자연수까지 모두 나누어보면 구할 수 있지만 $O(N)$의 시간 복잡도가 소요됩니다. 유클리드 호제법을 사용하면 $O(\log N)$ 에 최대 공약수를 구할 수 있습니다. 유클리드 호제법 유클리드 호제법은 인류사에서 가장 오래된 알고리즘 중 하나로 알려져 있는 알고리즘입니다. 2개의 자연수 a, b (a > b) 에 대해서 a를 b로 나눈 나머지를 r이라 하면 a와 b의 최대 공약수는 b와 r의 최대 공약수와 같습니다. (GCD(a,b) = GCD(b, a%b)) a, b의 최대공약수를 g라..

반응형