백준에서 lower_bound, upper_bound는 정렬된 배열에서 상당히 많이 썼습니다. 파이썬에는 없을까요? bisect 모듈에는 bisect_right와, bisect_left가 있습니다. 쉽게 말해서 이 둘은 정렬된 list에서 upper_bound와 lower_bound에 대응되는데요. 어떻게 동작하는지 보겠습니다. 키가 정수인 경우에 대해서 생각해 보겠습니다. 먼저, 전자부터 보겠습니다. 일단 lo와 hi는 탐색 범위를 의미합니다. 배열 전체를 탐색하려는 경우에는 a와 x를 넣습니다. 여기서 a는 list이고 x는 기준 값을 의미해요. 여기서, 우리는 어떻게 범위를 좁히는지 볼 필요가 있는데요. a[mid]보다 x가 작으면 hi가 mid가 됩니다. 즉, 찾으려는 수 보다 a[mid]가 큰 ..
레퍼런스 검색 결과
java에서 computeifabsent랑, computeifpresent는 꽤 유용하게 쓸 수 있는 Map 메소드입니다. 이 중에서, 저는 후자를 위주로 설명하도록 하겠습니다. 먼저, computeifpresent 메서드에 대한 설명을 보겠습니다. 어려울 것은 없고요. key와 Bifunction을 받습니다. key가 이미 있는 경우에는, key와 value를 가지고 새롭게 mapping하는 것을 시도하는 함수입니다. 그런데 이 설명만 보아서는 어떤 일을 하는 지 알기가 쉽지 않아 보입니다. 예제를 작성해 보겠습니다. 먼저, 3가지 연산을 한 후에, map에 있는 내용을 출력하게끔 하였습니다. 결과를 보고 이야기 해 보겠습니다. 먼저, 처음에 맵은 비어 있었을 겁니다. 2를 추가하려고 하니 없었으므로,..
c++ STL에서 fill을 어떻게 쓰는지 예제로 알아봅시다. 이것은 공식 문서에 따르면, forward 이터레이터 2개가 필요합니다. 그리고 해당 이터레이터는 이 문서에 설명이 자세히 되어 있습니다. 그런데 보통, 저는 배열이나 벡터 등에서 많이 썼습니다. 그 외 다른 경우에는 쓴 적이 없었습니다. 그러니, 이 자료구조에서 어떻게 fill 함수를 쓰는지를 중점적으로 설명하겠습니다. 예제 1번입니다. int 벡터 배열 v가 선언되어 있습니다. 여기에 들어있는 내용 전체를 0으로 초기화 하려고 합니다. 16번째 줄에 보면, v.begin() 부터, v.end()까지를 범위로 주었습니다. 이는 v의 시작과, 끝을 의미합니다. 이것을 어떠한 값으로 초기화를 시킬 건데요. 3번째 인자에 0이 들어갔음을 볼 수 ..
java에서 어떻게 Priority Queue를 쓸까요? 예제로 간단하게 알아보도록 하겠습니다. 먼저, 기본적으로 Comparable이 구현이 되어 있는 경우에는, 따로 compareTo를 정의하지 않아도, 알아서 우선순위가 높은 것 부터 빠져나옴을 알 수 있어요. 예를 들자면 String 클래스의 경우에는 다음과 같이 선언이 되어 있습니다. 여기서 중요한 것은 Comparable입니다. 비교 가능하다는 것입니다. 그러면 내부에 compareTo가 정의가 되어 있을 겁니다. 보니까 정의가 되어 있네요. 예제 프로그램 1을 봅시다. 보통 pq를 구현할 때, 이런 식으로 많이 구현합니다. pq가 비었는지 확인하기 위해서, isEmpty를 호출합니다. 그리고, 맨 위에 있는 원소를 꺼내기 위해서 poll 메서..
예전에 네이버 블로그를 운영했을 때, 이 글에서 compare 메서드에 대해서 언급했던 적이 있었습니다. 이것에 대해서 혼동되게 설명한 것도 있고, 잘못 설명한 것도 있어서 다시 짚고 넘어가겠습니다. 먼저, Comparable interface에 정의된 CompareTo 메서드에 대한 설명입니다. 특정 object를 ordering을 위해서 비교한다고 되어 있습니다. 우선 순위가 높다. 낮다 보다는, 순서를 매기기 위해서 이 메서드를 호출한다고 보는 것이 적절해 보입니다. 그리고 리턴 부분을 보면, -1, 0, 1이 아닌 단순히 음수, 0, 양수를 리턴한다고 되어 있습니다. -1을 리턴하는 것과 음수를 리턴하는 것은 의미상 차이가 분명히 있는 부분입니다. 아래 예제 프로그램을 보시면 명확하게 다가옵니다...
최근댓글