자바에서 map이나 set에 특정한 원소들이 모두 있는지 확인하려면 어떻게 해야 할까요? stream을 생각하기 쉽지만, 사실 map이나 set에서는 containsAll을 쓰는 게 나을 수도 있습니다. containsAll은 collection이 c에 있는 모든 원소들을 가지고 있는지를 판단합니다. 보통 stream의 allMatch나, filter를 이용해서 처리하기도 할 텐데요. 저는 containsAll 메소드를 쓰는 것을 보다 선호합니다. 더 직관적이기 때문입니다. 사용법을 간단하게 보겠습니다. ori와 tar에 1부터 10까지 키를 넣었습니다. 그러면 처음에 둘 다 1부터 10까지 들어있을 테니, ori가 tar에 있는 원소들을 모두 가지고 있는 것이 맞습니다. 문제는, ori에서 5를 제거했..
map 검색 결과
제가 낸 3회 코딩테스트 문제 중에 가희와 쓰레기 놀이가 있었습니다. 이 문제의 input에 대한 output 파일을 생성하기 위해 작성한 파일이 이 코드였는데요. 생각보다 오래 걸렸답니다. 대략 13 ~ 14초 정도 걸렸던 걸로 기억해요. 이 로직을 그대로 validator에도 썼기 때문에, 벨리 데이터가 시간 초과가 나기도 했습니다. 제가 작성했던 처음 버전의 솔루션 코드를 유심히 보실 필요는 있습니다. 왜냐하면, 생각보다 비효율적인 일을 하고 있기 때문입니다. 이 부분을 먼저 보겠습니다. new_ref의 내용을 그대로 ref에, new_con의 내용을 그대로 con에 넣어버리는 부분입니다. bfs 함수가 끝나기 직전에 호출하는데요. 이 두 친구는 bfs 내의 지역 변수로 선언되어 있어요. 이 부분입..
안녕하세요. 이번 시간에는 map의 merge 메소드에 대해서 간단하게 알아보겠습니다. 먼저 예제 프로그램을 하나 보겠습니다. 이 예제는 매우 간단한 프로그램인데요. 3번째 인자에 이상한 람다 식이 들어가 버립니다? 뭔지는 모르겠지만, 키에 대응되는 value 값에 concat를 시키는 모양입니다. 그러면 결과가 어떻게 나올까요? 키 값이 1인 것의 Value는 "ab", 키 값이 2인 것의 Value는 "cd"가 나오게 됩니다. 메서드 설명을 봅시다. key가 없는 경우라면 v값을 넣어버리고, 그렇지 않으면 remapping function에 의해서 나온 값으로 replace 한다고 되어 있어요. 이 메서드는 결정적으로 multiple value에 대해서 값을 combining 하기 위해 쓴다고 되어 ..
java에서 map, set 계열을 다룰 때 전체 원소들을 순회해야 할 때가 있습니다. 이 때 어떻게 해야 하는지 간단하게 알아보겠습니다. 보통 map 계열 중에서는, treemap과 hashmap의 사용 빈도가 꽤 높은 편인데요. 이는 hash 계열은 equal 쿼리에, tree 계열은 range 쿼리에 매우 유리한 구조이기 때문입니다. 그리고 저는 농담처럼 자바에서는 TreeMap만 알고 있으면 풀 수 있는 코딩테스트 문제가 상당히 많을 거다. 라는 말도 하는데요. equal 쿼리도 성능이 그렇게 썩 나쁜 편이 아니기 때문입니다. 로그 복잡도로 찾아도 나름 빠르기도 하고요. 먼저, Map에서의 Key, Value 쌍을 모두 순회하기 위해서는, keySet을 이용해야 합니다. 이것은 Map에 있는 ke..
java에서 hash나 tree 계열 (흔히 rb로 구현된) map은 key 값이 주어졌을 때, value를 빠르게 찾는 자료구조입니다. 예를 들어, hash 계열의 map은 key 값을 가지고 계산된 hash 값을 가지고, 특정한 버킷에서 값을 찾아버립니다. Treemap이나 set은 정렬이 되어 있습니다. key값의 대소에 따라 정렬이 되어 있다면, 적절한 연산을 통해 O(log(size))의 복잡도로 찾기 연산을 수행할 수 있습니다. 문제는, 이런 경우입니다. 값을 기준으로 키도 빠르게 찾아내려면 어떻게 해야 할까요? TreeMap이나 HashMap이 Key값을 토대로 Value를 빠르게 찾아낸다고 했습니다. 반대로 생각하면 어떨까요? Value 값을 토대로 대응되는 키 값을 빠르게 찾아내려면, 키..
최근댓글