백준에서 파이선으로 문제를 몇 개 풀었습니다. 그렇지만 아직 Java나 C만큼 익숙하지 않은 것은 현실입니다. 파이선에는 list.pop(0)이 있는데요. 이것에 대해서 알아보겠습니다. 간단한 테스트 프로그램을 작성해 보겠습니다. 숫자 하나를 테스트 케이스마다 입력 받습니다. 10000000이 nu개 들어있는 리스트가 있는데요. 여기서 맨 앞에 있는 원소를 꺼내 올 겁니다. 이를 9번째 줄의 list.pop(0)이 하고 있습니다. 실행 결과는 어떻게 나올까요? 2000, 20000, 20만 이렇게 범위를 늘려가면서 시간을 측정해 보았는데요. 데이터 크기가 10배 늘어날 때 마다, 대략 100배 정도의 시간이 더 걸림을 알 수 있습니다. while 루프는 원소가 빌 때 까지 돌았으니, 총 nu번 돌았을 겁..
레퍼런스/분석 검색 결과
안녕하세요. chogahui05입니다. 자바의 해시맵은 hashCode를 기반으로 버킷의 어디에 들어갈지를 계산합니다. 그런데, putVal을 자세히 보셨다면 아시겠지만, hash function의 리턴값을 인자로 넣는 것을 알 수 있습니다. 이것은 어떻게 된 일일까요? java8에서 모 자료구조 코드를 조금씩 뜯어봅시다. get 메서드를 보시면, getNode를 호출합니다. 그리고, 이 메서드는 hash(key)를 인자로 삼습니다. 이것은 put도 마찬가지입니다. 내부적으로 putVal을 호출하고, 이것 역시 hash(key)를 호출합니다. 내부를 보시면, key.hashCode 값을 h에 넣습니다. 여기서, 해시코드는, 오버라이딩이 된 hashCode 값입니다. 그리고 이것과 다른 값을 비트 xor을..
HashMap 클래스는 내부적으로 RB tree를 씁니다. 이것을 적용하기 위해서는 compare, 즉 비교를 할 수 있는 비교자가 재정의가 되어야 하는데 (대표적으로 TreeMap, TreeSet 등이 있는데, 비교체 구현 없이 써 보면 어떤 일이 일어날지는..) , 우리는 굳이 그것을 정의하지 않고도 쓸 수 있었습니다. 어떻게 그런 일이 가능했을까요? 답은 tieBreakOrder 메소드에 있었습니다. 이 메서드에 대해 이해하기 전에, 아래 두 글을 읽고 오시는 것을 권장드립니다. [관련글] 왜 equals를 재정의하면 hashCode도 같이 재정의 해야 할까요? hashCode가 모두 같을 때 어떤 일이 일어날까요? 먼저 임의의 객체 하나를 만들어 보겠습니다. 이름은 MyObj라고 짓겠습니다. eq..
이번 시간에는 ArrayList의 remove에 대해 알아보겠습니다. remove를 보시면, int형을 받는 것이 있고, Object를 받는 것이 있습니다. int를 wrapping한 것은 Integer입니다. auto boxing까지 생각한다면 이 둘이 헷갈릴 소지가 매우 다분합니다. 특히 Integer는 스택 오버플로우에도 꽤 많이 올라왔던 질문 중 하나였습니다. 이 기회에 정리를 해 두시는 것도 괜찮겠습니다. 먼저 Object를 받는 remove를 알아보겠습니다. 먼저, Obj를 하나 생성하였습니다. 여기에는 equals가 재정의 되어 있지 않습니다. 저는 여기에서, "gahui"가 들어간 오브젝트를 새로 생성하였습니다. 그리고, 새롭게 생성한 "gahui" 라는 오브젝트를 li에서 제거할 건데요...
java의 hashset은 어떻게 동작할까요? hashmap과 다른 점은 map은 Key로부터 Value를 뽑아올 수 있지만, set은 Key값만을 중요하게 여긴다는 것입니다. 그런데, 뭔가 이상하지 않나요? HashMap하고, Set은 그것 말고는 거의 동일한 기능을 수행합니다. 상식적으로 생각해 보았을 때, HashSet 기능들을 일일히 다 구현을 하는 게 효율적일까요? 아니면 이미 구현된 HashMap의 기능을 이용하는 게 효율적일까요? 후자일 겁니다. 이 정도만 이해하셨다면, 이 글의 90%를 이해하신 겁니다. 나머지 10%는 밑에서 후술하도록 하겠습니다. 예제 프로그램을 보겠습니다. 간단하게 HashSet hs를 선언했습니다. 이것은 Integer를 Key로 가지는 자료 구조입니다. 안에 필드를..
최근댓글