파이선으로 백준을 푸시다 보면, 이런 거 한 번 쯤 복사 붙여넣기 하신 적이 있을 겁니다. 이 포스트에서는 노란 부분 말고, 파이썬 map 함수만 알아보도록 하겠습니다. 공식 문서에 보면, 이 함수는 다음과 같이 설명이 되어 있습니다. 먼저, iterable부터 봅시다. 이터레이터. 어디에서 동작했나요? c++의 STL에서는 vector, map 등에서 동작했습니다. 즉, 순회 가능한 무언가라는 것입니다. 예를 들자면, python의 list는 동적 배열입니다. 이것은 순회 가능한 자료구조 중 하나입니다. 여기서 next를 부르면, 이터는 현재 가리키고 있는 2 다음 원소인 3을 가르킵니다. 그러면, 2번째 인자가 이해가 되실 겁니다. input().split()은 입력받은 문자열에 대해서, white ..
map 검색 결과
안녕하세요. 조경완입니다. 어제 카톡 방에 이런 질문이 올라왔습니다. mutable한 객체를 키 값으로 넣었고, 맵이나 셋을 넣은 키를 어디선가 변경했는데, 왜 맵이나 셋 계열의 containsKey가 제대로 동작하지 않을까요? 사실, String을 키 값으로 삼으면 문제는 없습니다. 이것은 immutable 하기 때문입니다. 뮤터블의 반대 말이죠. im이 붙으면. 아래 예제 프로그램을 보겠습니다. 코드에서 필요 없는 부분은 생략하였습니다. equals는 x 값이 같으면 true를 리턴하게 되어 있습니다. 그리고 hashCode는 x를 2로 나눈 나머지를 돌려줍니다. Main 함수를 보겠습니다. x에 2, 3을 넣은 객체 a, b를 hashMap에 넣습니다. 그리고, 객체 a의 x값을 2에서 5로 바꿉니..
C++의 STL에서 multimap은 상당히 유용하게 쓰입니다. Java에서는 그렇게 쓸 수 없을까요? 저는 Key값이 중복되는 경우에도, Map 계열에 저장하고 싶습니다. 어떻게 하면 좋을까요? 그 전에 Java의 Map 계열이 어떻게 동작하는지 간단하게 정리하고 가겠습니다. map.find(K)를 호출했을 때 개략적인 흐름을 보겠습니다. 먼저, map 계열이 키가 K인 값을 찾는 구조입니다. 그러면, 자료구조에서 Key가 K인 것을 찾는데, 이 작업을 하기 위해 내부적으로 호출되는 메서드가 equals입니다. put(K,V')가 호출되었을 때, Key가 K인 것이 존재했다면, 데이터 를 가 같이 저장될 수 없습니다. 예를 들어, K가 가수이고, V가 발매한 앨범이라고 해 보겠습니다. Key dupli..
Map 계열 메서드 중에서 get, containsKey가 있습니다. 이들은 어떤 메소드들일까요? 먼저, 다음과 같은 정보는 어디에선가 들어보셨으리라 생각이 듭니다. map 계열 구조에 Key값에 대응되는 값 Value를 불러오고 싶을 때 보통 이렇게 많이 쓴다. 그런데, 프로그램 1과 같이 작성하면, 불필요한 연산을 2번 하게 된다. 프로그램 2와 같이 쓰는 것이 좋다. 왜냐하면 불필요한 연산을 수행하지 않기 때문이다. 네. 이 부분은 맞습니다. containsKey나 get나 내부적으로 getNodes라는 것을 호출하는데요. 이것을 1번 수행하냐, 2번 수행하냐의 차이는 생각보다 크게 다가올 수 있습니다. 여기서 질문 하나 드리겠습니다. 프로그램 1의 hm에 들어있는 key 값들의 집합을 k1이라고 ..
질문이 하나 들어왔습니다. 아래에 있는 foo 함수의 시간 복잡도는 어떻게 되나요? 쉽지 않은 질문입니다. c++에서 map이나 set은 self balanced binary Tree로 되어 있습니다. 흔히 '균형 트리' 라고 이야기를 합니다. 중요한 것은 어느 기준 점을 기준으로 왼쪽은 작은 것이, 오른쪽은 큰 것이 저장이 되어 있다는 것입니다. set이나 map이 Binary Tree의 속성을 가진다는 것은 시간 복잡도를 계산하는 데 굉장히 중요한 정보입니다. 즉, root를 기준으로 작은 것은 L, 큰 것은 R 부분에 있습니다. 그렇다면, iterator를, s.begin()부터, s.end()에 도달할 때 까지, 순회한다고 생각해 봅시다. 즉, 작은 것부터 큰 순서대로 순회를 한다고 하면 어떻게 ..
최근댓글