일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- QUICKSTARTGUIDE
- COSPRO
- 완전탐색
- 백준코딩테스트
- 우선순위큐
- 다익스트라
- 알고리즘
- 01BFS
- deque
- 네트워크플로우
- 시뮬레이션
- DFS
- YBMCOS
- java
- 자바PS
- 구현
- COSPROJAVA1급
- 재귀함수
- 이젠 골드구현도 어렵네..
- BFS
- 다이나믹프로그래밍
- 취득후기
- 세그먼트트리
- 백준
- PS
- spring
- dp
- GatherTown
- 게더타운시작
- 엘라스틱서치
- Today
- Total
공부공간
Algorithm 풀이를 위한 JAVA 자료구조 정리 본문
본 포스트에서는 JAVA에서 Problem Solving을 위한 자료구조를 다룬다.
다룰 항목은
1. ArrayDeque 2. PriorityQueue 3. HashMap 4. HashSet
이다. 사용빈도는 각각 다르지만 적절한 자료구조를 선택함에따라서, 시간을 크게 단축할수 있다.
ArrayDeque
ArrayDeque는 Queue를 상속받아 구현한 것이다. 양방향 큐와 Stack을 동시에 사용할수있는 자료구조이다.
입/출력의 속도가 빠르고 동기화의 부분을 줄이므로 시간을 단축하였다.
Java Tip #2 : 큐(Queue) 성능 테스트
출처 : http://yjacket.tistory.com/48 한글 api : http://www.designonex.com/bbs/board.php?bo_table=j2s...
blog.naver.com
자세한것은 위 포스팅을 참고하자.
선언은
ArrayDeque < Class > 변수이름 = new ArrayDeque<>(InitDeque_size);
간단한 주요 기능을 살펴 보자.
Queue의 기능과 Stack의 기능을 모두 가지고있다고 생각하면된다.
Queue에서 peek을 할때 First에서할것인지 Last에서 할것인지 선택할 수 있고,
offer (= add) 할때에도 양방향큐의 기능처럼 작동한다.
또한 Stack에 기능으로 사용할때에 push / pop 의 기능도 지원하기 때문에 사용자가 원하는대로 사용하면된다.
Priority_Deque ( 우선순위 큐 )
큐에 들어간 특정요소에 우선순위를 부여하고 싶을때에 사용한다.
구조는 Tree 구조로 구현되어있으며 Max-heap을 통하여 구현하는데, 간단하게
완전이진트리구조에서 새로운 데이터가 추가되었다면, 맨 마지막남은 Leaf부분에 데이터를 추가하고
Leaf의 부모와 크기비교를하면서 크면 바꾸는 식으로 루트 노드까지 올라가서 적절한 자리에 위치한다.
우선순위를 비교하기위해 2가지 방법이 있다.
1. Class를 정의할때 compareTo()를 오버라이딩하여 재정의해서 사용하는 방법
2. PQ를 정의할때 Comparator객체의 compare() 메소드를 오버라이딩하는 방법
2가지중에서 한가지만 확실하게 다루어 보자
PriorityQueue Pq= new PriorityQueue<>(InitPriority_queue_size , Comparator 객체);
선언은 위와같이하고, Comparator를 따로 선언하지 않고, 자료형이 하나라면 최대힙구조로 구현되었으므로
오름차순을 따른다.
내림 차순으로 출력하고 싶다면 Collections.reverseOrder()를 Comparator에 추가하자
사실 이런경우에 우선순위 큐를 사용하려는 것이아니다. 실제 BFS를 통해서 탐색할때에 내가 원하는
클래스의 인스턴스에 우선순위를 부여하자.
먼저 Pq에는 Node 클래스의 객체가 담긴다고 하자, 우리는 이러한 Node클래스에서 Edge값이 큰 순서대로
먼저 Queue에 앞부분에 오길 원한다.
이러한 경우 int 값을 리턴하는 compare메소드를 재정의하게 되는데,
비교할 두 클래스를 인자로 받아서 -1 , 0 , 1의 세 값중 하나로 리턴을하게된다.
리턴값이 -1 이나 0 이면 두 객체의 위치를 바꾸지 않고
1인 경우에 바꾸게 된다.
쉽게 설명하기 위해서 Target node를 설정해보자, 우리는 Target Node에 우선순위를 부여할 것이다.
위와 같은 상황에서 우리의 타겟노드는 n2이다 즉 어떠한 값하고 비교했을때에 ( 내림차순 기준 )
Target에 해당되는 값이 다른 값보다 크면 우선순위를 1 주고, 아닌경우에 -1을 주자.
이렇게 진행한다면, 여러번의 비교로 우선순위가 정해지게 된다. 따라서
큐에 있는 객체들은 지정한 우선순위에 따라서 정렬되게 된다.
여러가지우선순위를 어떻게 처리할까?
위와같은 상황에서,
node 객체의 edge를 우선순위로 잡고 edge가 같은 경우에는 number를 기준으로 정렬하고 싶을때에는?
적절하게 Comparator를 수정할 수 있다.
바로 예시를 통해서 본다면,
PS를 위한 람다식
이러한 것이 익숙해졌다면 실제 문제를 푸는 상황에서는 두가지에 대한 우선순위를 부여하기 보다는 한가지에 대한
우선순위로 큐를 정렬하는 경우가 많다, 매번 compare를 오버라이딩 하기보다는 lambda식을 통해서 한줄에 처리하자
이렇게도 선언할 수 있다.
풀어서 생각해본다면,
우리는 node n1,n2를 오름차순으로 비교 할 것인데 Target은 n2 이다.
n1 과 n2의 edge값을 비교하는데 n2가 숫자가 작으면 n2에게 우선순위를 더 주어야겠다
정도로 풀어서 생각할 수 있다. 처음에는 익숙하지 않지만 관련 문제를 풀어보자.
https://www.acmicpc.net/problem/11279
11279번: 최대 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 큰 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 2^31보다 작다.
www.acmicpc.net
https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 절댓값이 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 정수는 -231보다 크고, 231보다 작다.
www.acmicpc.net
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15QRX6APsCFAYD
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
ExpertAcademy - 보급로 문제
HashMap
Map은 Key와 Value로 이루어진 일대일 자료구조라고생각하면 된다.
파이썬의 Dictionary와 아주 똑같고 Key를 통해서 Value를 가져온다
선언은
HashMap<Key, Value> hm = new HashMap<>();
으로 선언하고
Key에는 Wrapper Class나 Reference Type의 객체가 들어간다. 예시를보자
하나의 키에대해서 값을 여러번 넣는경우에는 마지막에 들어간 값이 그 키에 해당되는 값으로 저장되는 것을 볼수있다.
또한 Hashmap.get(Key) 로 내가 원하는 키에 해당되는 요소를 가져올 수 있다.
관련 문제를 풀어보자
https://www.acmicpc.net/problem/1620
1620번: 나는야 포켓몬 마스터 이다솜
첫째 줄에는 도감에 수록되어 있는 포켓몬의 개수 N이랑 내가 맞춰야 하는 문제의 개수 M이 주어져. N과 M은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수인데, 자연수가 뭔지는 알지? 모르면 물어봐도 괜찮아. 나는 언제든지 질문에 답해줄 준비가 되어있어. 둘째 줄부터 N개의 줄에 포켓몬의 번호가 1번인 포켓몬부터 N번에 해당하는 포켓몬까지 한 줄에 하나씩 입력으로 들어와. 포켓몬의 이름은 모두 영어로만 이루어져있고, 또, 음... 첫 글자만
www.acmicpc.net
HashSet
Set 자료구조는 자주사용하지 않지만, 중복을 제거면서 저장되는 자료구조이다.
내가 중복된 값을 넣어도 알아서 제거해준다. 때문에 자료간 순서는 보장되지 않으며,
toArray() 메소드로 들어간 요소를 추출할 수는있지만 PS에서는 중복제거용으로 많이 사용되기에
add() 와 size() 정도만 알면 된다.
이러한 자료구조를 몰라도 사실 하나하나 코딩 ( Max heap 구현 , 중복제거 ) 등을 구현 할 수있지만
알고 적절하게 사용한다면 좋을것같아서 정리했다.
'알고리즘 > 구현,시뮬' 카테고리의 다른 글
BOJ - 17779 ) 게리맨더링 2 (0) | 2020.02.18 |
---|---|
JUNGOL - 1828 ) 냉장고 (0) | 2020.02.13 |
SWEA ) 대관이의 대량할인 (0) | 2020.02.09 |
SWEA ) 줄기세포 배양 (2) | 2020.02.09 |
BOJ - 14890 ) 경사로 (0) | 2020.02.07 |