본문 바로가기

전체 글

(276)
고정점 찾기 유형 파악 및 구현 이 문제는 두가지 방법으로 풀 수 있다. 파이썬에서 제공해주는 함수를 이용하거나 그냥 이진탐색을 내가 구현한다. 배열은 이미 정렬되어있다. "정렬되어 있는"이라는 말이 나오면 이진 탐색을 의심하는 것도 좋은 습관인 것 같다. 1. 이진 탐색 구현 방식은 그동안 하던 방식과 동일하다. 하지만 정당한지 봤을 때, 예를 들어 인덱스 2에 3이 있다고 가정하자. 인덱스 3부터는 value가 무조건 3보다는 클것이다. 따라서 이런 경우, 굳이 다음 부분을 확인할 필요가 없게 된다. 반대 경우도 마찬가지이다. 2. 함수 사용 bisect_left or bisect_right를 이용해 구현 가능하다. 이는 이진탐색을 기반으로 하는 탐색 알고리즘이다. 코드 arrays = [-15, -6, 1, 3..
정렬된 배열에서 특정 수의 개수 구하기 유형 분석 및 구현 이 문제는 직접 이진탐색을 구현한다기 보단, 파이썬에서 제공하는 이진탐색을 활용한 탐색 방법을 사용한다. 순차적 탐색과 비교해보면 최대 100만개에 데이터 중에서 최대 100만개의 데이터를 찾아야한다. 하지만 이진 탐색을 활용하면 확 줄어든다. 코드 from bisect import bisect_left, bisect_right n = 7 x = 2 array = [1, 1, 2, 2, 2, 2, 3] left_index = bisect_left(array, x) right_index = bisect_right(array, x) print(left_index, right_index) result = right_index-left_index if result == 0: print("-1..
떡볶이 떡 만들기 유형 파악 및 구현 떡의 최대 개수는 백만이고 요청한 떡의 최대 길이는 20억이다. 즉, 떡 백만개에 대해서 0부터 20억 사이의 값으로 잘랐을 때, 원하는 길이가 나와야되고 안나온다면 가장 가까운 값을 출력해야하는 문제이다. 만약, 자르는 길이 선정을 순차적 탐색으로 이를 구현한다고 했을 때, 1cm단위로 자르다 20억cm단위까지 잘라봐서 떡의 길이의 합이 m일 때 멈춘다. 최악의 경우 20억*100만의 연산을 한다. 시간 복잡도는 O(N*M) 반대로, 이진탐색으로 자르는 길이를 탐색한다면, 정렬을 할 필요는 없으므로, 정렬에 대한 연산 비용이 들지 않으니 고려하지 않고 시간 복잡도는 O(M*logN)이다. 따라서 이 문제는 무조건 이진탐색을 사용해야 한다. 코드 n = 4 m = 7 arrays = ..
부품 찾기 유형 분석 및 구현 이 문제는 이진탐색 또는 계수 정렬을 통해 풀 수 있다. 조건은 다음과 같다. N = 최대 백만 정수의 범위는 백만이하이다. M = 최대 10만 예를 들어, 이 문제를 순차적 탐색으로 해결한다고 가정하면 시간 복잡도는 log(M*N)이다. N(앞에서부터 하나하나 확인해가면 찾으려는 값일 때, 끝냄) M(찾으려는 값 수) 최악의 경우 1조회의 연산이 필요하다. 하지만 이진탐색으로 해결시 우선 정렬이 필요한데, 파이썬의 정렬의 연산수는 NlogN이다. 이 후 이진탐색으로 해결시 M개의 데이터에 대해 총 MlogN이다. 결과적으로 시간 복잡도는 O((N+M)logN)이다. 굉장히 작아짐을 알 수 있다. "연산 계산시 조건에 맞추어 풀 수 없다는 것을 직감한다면 바로 이진탐색을 사용하자." ..
Binary Search - Concept 해당 문제는 "이것이 코딩 테스트이다" 책을 참고하여 제작하였습니다. 순차탐색 - 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법 - 시간복잡도 : O(N) 이진 탐색 - 정렬된 배열에 대해서 반으로 쪼개가며 확인하는 방법 - 시간복잡도 : O(logN) - 구현 방법 : 반복문 or 재귀 함수 유형 " 코드를 정리하고 최대 탐색범위와 시간복잡도를 고려할 때, 연산의 수가 2000만(파이썬 평균 연산 수)를 넘어간다면 이진탐색 또는 계수 정렬 등을 고려하자. " " 정렬되어있을 때 라는 말이 많이 나옴"
못생긴 수 유형 파악 및 구현 이 문제는 생각해내는게 좀 어려웠던 것 같다. 못생긴 수는 2, 3, 5의 조합들을 의미한다. 못생긴 수의 리스트를 보면 1, 2, 3, 2x2, 5, 2x3, 2x2x2, 3x3, 2x5 이런식으로 진행된다. 즉 초기 못생긴 수를 넣고 (2, 3, 5) 이미 들어간 못생긴 수에 2, 3, 5를 곱하는 방식으로 진행된다. 구현을 하기 위해서는 2 or 3 or 5가 다음에 곱해져야하는 리스트 인덱스를 담는 변수 -> i2, i3, i5 결과마다 가장 작은 것을 뽑아서 리스트에 넣기 전 결과를 표현하는 변수 -> next2, next3, next5가 필요하다. 코드 # 찾으려는 인덱스 n = int(input()) # 못생긴 수 초기화 ugly = [0]*(n+1) # 첫번째 못생긴 수..
병사 배치하기 유형 파악 및 구현 예를 들어, [15, 11, 4, 8, 5, 2, 4]가 있을 때, 오른쪽으로 갈수록 수를 크게 만들면서, 리스트 내의 요소가 가장 많은 경우를 구하는 것이다. 이는 전형적인 다이나믹 프로그래밍의 문제 중 하나인 '가장 긴 증가하는 부분 수열 문제'이다. [15, 11, 4, 8, 5, 2, 4] dp 리스트는 아래와 같은 방식으로 채워진다. 4 - [1] : 마지막 요소 뒤에는 아무 요소가 없다. -> dp(n-1) 2- [1] : 2의 뒤에는 2보다 작은 요소가 없다. -> dp(n-2) 5 - [2] : 5의 뒤에는 2 or 4를 넣을 수 있다. -> dp(n-3) = dp(n-2) + 1 or dp(n-1) + 1 8 - [3] : 8의 뒤에는 (5, 2) or (5, 4)를 ..
퇴사 유형파악 및 구현 이 문제는 아이디어는 떠올리기 쉬웠으나 구현이 어려웠던것 같다. 아이디어 - 우선, 뒤에서부터 하나하나 확인을 한다. - 만약 걸리는 시간때문에 퇴사전 이 일을 마무리 못하는 경우라면 패스한다. - 가능하다면 추가를 한다. - 다음의 경우로 마지막날 전날 인터뷰에 대해서 점검을 하는데 예를들어, 7일까지 일을할 것이고 7일은 1일소요, 500원, 6일은 2일소요 100원이라고 가정하자 6일날 일하게 되면 6,7일은 일을 못하고 다음일은 8일부터 가능하다. 따라서 7일날 일하는 경우 vs 6일날 버는 돈 + 8일 이후에 버는돈 을 비교해 큰값으로 값을 기록한다. 이 후, 그 전날 , 그 전날 이런식으로 나아간다. 전형적인 DP문제이다. 하지만 헷갈렸던 거는, 기록을 하는 dp리스트는 크기..