본문 바로가기

반응형

분류 전체보기

(369)
코딩테스트 문제 (6) - 연속적으로 반복되는 최대 문자열 길이 간단한 문제입니다. 문제부터 바로 보시죠. 문제 1. 'hello' => 2 2. 'aaaabbbbbbbbcccabcd' => 8 'hello' 에서는 l이 2번 연속적으로 반복되므로 2가 return됩니다. 풀이 간단히 풀 수 있을 것 같습니다. 주어진 string을 for 루프를 통해 순회하면서 전 값과 현재 값이 같을 경우 count를 증가시키고 다를 경우 count를 초기화시키면서 기존 결과와 최대값을 비교하는 방식으로 가능할 것 같습니다. kaggle.com 의 notebook으로 작성한 풀이는 다음과 같습니다. 홍머스 정리 난이도: 하
코딩테스트 문제 (5) - 가장 큰 수 문제 이름이 가장 큰 수로 되어 있지만 당연하게도 배열 중 가장 큰 수를 찾는 문제는 아닙니다. 이 문제는 항목들을 조합하여 만들 수 있는 가장 큰 수를 출력하는 문제입니다. 문제 1. [10,2] => '210', 2. [3,30,34,5,9] => '9534330' [10,2] 케이스의 경우 10을 추출하는 것이 아닌 두 원소의 조합 '102'와 '210' 중 더 큰 수를 출력해야 합니다. 배열의 원소는 정수입니다. 풀이 [10,2]의 경우 10이 아닌 2가 앞에 위치하도록 정렬해야 합니다. [3,30,34,5,9]의 경우에는 9가 맨 앞에 위치하도록 정렬해야합니다. 이러한 순으로 정렬한 후에 각 원소를 string으로 만들어 join 메소드를 이용해 합치면 될 것 같습니다. 배열의 원소가 정수로 들..
코딩테스트 문제 (4) - 구간 병합 이 문제는 구간들을 원소로 가진 입력 리스트에 대해 겹치는 구간을 병합한 결과를 제출하는 문제입니다. 문제 1. [[2,6],[15,18],[1,3],[8,10]] => [[1,6],[8,10],[15,18]] 입력은 정렬되지 않은 상태로 들어옵니다. 풀이 먼저 입력이 정렬되지 않았으니 시작점 기준으로 정렬해야 할 것 같습니다. 그 후, for 루프를 통해 각 구간을 순회하면서 전 구간의 끝점과 현 구간의 시작점을 비교해서 두 값이 겹치게 되면 병합하면 될 것 같습니다. kaggle.com 의 notebook으로 작성한 풀이는 다음과 같습니다. 홍머스 정리 난이도: 하 참조 , p497-498 leetcode.com/problems/merge-intervals/
코딩테스트 문제 (3) - 두 배열의 교집합 두 배열의 교집합을 찾는 문제입니다. 중복된 문자는 고려하지 않고 한 문자로 취급합니다. 문제 1. array1 = [1,2,2,1], array2 = [2,2] => [2] 2. array1 = [4,9,5], array2 = [9,4,9,8,4] => [9,4] 풀이 array1과 array2에 대해 이중 for 루프를 돌면서 결과 집합 (파이썬의 set)에 추가하면 될 것 같습니다. 하지만 array 2개의 루프를 수행하니 시간 복잡도는 $O(n^2)$가 되겠네요. 더 작은 시간 복잡도가 걸리는 방법은 뭘까요? array1에 대해서는 그대로 for 루프를 수행하고 for 루프 안에서 해당 array1의 값을 array2에 대해 이진 탐색으로 값을 검색하면 어떨까요? 이진 탐색은 시간 복잡도가 $O(..
파이썬 이진 탐색 내장 모듈 - bisect 파이썬에는 bisect 라는 배열 이진 검색을 지원하는 내장 모듈이 있습니다. 내장 모듈인 만큼 pip 를 통해 설치할 필요가 없고 파이썬 설치와 동시에 사용할 수 있습니다. bisect는 이진 탐색을 구현하면서 이미 정렬된 배열에 대해 특정 원소 (target) 를 삽입했을 때, 다시 정렬할 필요가 없도록 관리하는 모듈로 이진 탐색 개요 포스트에서 처럼 타겟이 없을 때 -1을 return하는 것이 아니라 타겟이 정렬이 필요없을 삽입 위치의 인덱스를 return합니다. 모듈인 만큼 여러 함수가 있지만 이 포스트에서는 주로 쓰이는 bisect_left, bisect_right 에 대해 알아보도록 하겠습니다. bisect_left(a, x, lo=0, hi=len(a)) 입력 파라미터를 살펴보면, a: 대상..
이진 탐색 (binary search) 이진 탐색 (혹은 검색, binary search) 는 이미 정렬된 배열에서 타겟을 찾는 검색 알고리즘으로 시간 복잡도가 $O(log n)$이 소요되는 대표적인 로그 시간 알고리즘입니다. 술자리에서 0부터 100까지의 임의의 숫자를 생각해 놓고 업다운을 통해 숫자를 맞추는 게임이 있습니다. 이때, 하나씩 높여가는 것이 아니라 50 -> 25,75 -> 12,37,87 등 숫자 범위의 절반을 줄여가면서 탐색 범위를 점점 좁히게 되죠. 합병정렬처럼 매번 절반으로 쪼개니 $O(\log n)$의 시간 복잡도가 소요됩니다. 절반으로 탐색 범위를 좁혀 계산 횟수가 $\log$ 만큼 줄게 만드는 것은 시간 복잡도 측면에서 굉장히 강력한 성능을 띠게 됩니다. 100까지의 숫자는 7번, 1억까지의 숫자도 27번의 비교로..
코딩테스트 문제 (2) - 유효한 괄호 이 문제는 괄호 "(,),{,},[,]" 로 이루어진 string이 입력으로 들어왔을 때, 괄호의 여는 곳과 닫는 곳이 문맥 상 일치하는지 묻는 문제로 대표적인 스택 문제입니다. 테스트 케이스를 한 번 살펴보죠. 문제 1. '{}(){}' => True, 2. '{()}[]' => True, 3. '{{)}[}' => False, 4. '(([]))' => True 풀이 스택 문제라고 언급했는데, 스택을 어떻게 이용해야 할까요? 스택은 마지막 원소가 추출되니 '[', '(', '{' 같이 여는 괄호를 스택에 순서대로 넣어두고 ']', ')', '}' 가 들어오면 스택에서 pop해서 매칭이 되는지 확인하면 될 것 같습니다. 그리고 마지막에 스택에 원소가 남아 있으면, 매칭되는 닫는 괄호가 입력에 없는 것이..
코딩테스트 문제 (1) - 섬의 개수 이 문제는 페이스북이나 기타 IT 기업에서 면접 때 자주 쓰이는 유명한 문제로 여러 변형들이 있으나 그래프 순회 방법 (DFS)로 푸는 방법은 거의 비슷합니다. 먼저 문제를 살펴 보겠습니다. 문제 다음 그림에서 1을 육지로 0을 물로 가정했을 때, 섬의 개수를 구하여라. '1'과 '0'으로 이루어진 중첩 리스트가 입력으로 들어온다고 가정한다. 문제 자체는 위의 그림에서 하얀색 3개의 덩어리를 구하면 되는 문제이고 위 테스트 케이스의 정답은 3이 됩니다. 풀이 먼저 두 번의 for 루프로 입력으로 들어온 중첩리스트를 훑으면서 '1'을 발견했을 때 어떤 액션을 취해야 할 것 같습니다. 동서남북 방향으로 '1'이 연결되어야 섬의 조건을 만족하므로 (i,j) 점에서 (i+1, j), (i-1, j), (i, j..

반응형