일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
Tags
- 운영체제
- 타입 객체
- 스케줄링
- 컨디션 변수
- 쓰레드
- 그리디 알고리즘
- 다이나믹프로그래밍
- Direct12
- 디자인패턴
- 멀티프로세서
- 영속성
- 병행성 관련 오류
- 멀티쓰레드
- directx
- OS
- DirectX12
- 알고리즘
- codility
- 다이나믹 프로그래밍
- I/O장치
- 백준
- 병행성
- 락
- 렌더링 파이프라인
- 프로그래머스
- 동적계획법
- 파일시스템 구현
- 자료구조
- DirectX 12
- 그리디알고리즘
Archives
- Today
- Total
기록공간
Dominator (Codility) - Java 본문
반응형
문제
정수값을 담는 N개의 배열 A가 주어진다. A에 존재하는 정수값이 중복으로 배열 사이즈의 절반 이상 존재하는 경우 그 정수값은 Dominator가 된다. 이 Dominator를 찾고, 이 Dominator 값인 인덱스 위치 중 하나를 출력하는 문제이다.
해결 방법
중복되는 값으로 몇 개가 존재하는지 효과적으로 알 수 있도록 해시 테이블을 사용한다. 해시의 Key값에는 인덱스에 존재하는 값이 들어가고, Value값은 그 값이 존재하는 인덱스들을 담는 Vector 컨테이너가 들어간다.
배열 A를 순회돌며 해시 테이블에 Key값과 Value값을 넣어준다. 그 작업이 끝나면 해시 테이블에 들어간 값(Iterator)를 순회돌며 배열 A 사이즈의 절반이 넘어가는 Dominator가 존재하는지 찾는다.
만약 존재한다면 그 값의 Value값(Vector)의 첫번째 원소를 정답으로 리턴한다. 만약 존재하지 않는다면 -1을 리턴한다.
구현 코드는 다음과 같다.
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
class Solution {
public int solution(int[] A) {
int result = -1;
// 해시 테이블 생성
HashMap<Integer, Vector<Integer>> hm = new HashMap<Integer, Vector<Integer>>();
// 순회돌며 Key, Value 값을 채운다.
for(int i = 0; i < A.length; ++i) {
if(hm.containsKey(A[i])) {
// 이미 Key가 존재하는 경우 Value값인 Vector를 받아와
// 해당 인덱스 값을 추가하고 해시의 Value값을 갱신한다.
Vector<Integer> v = hm.get(A[i]);
v.add(i);
hm.replace(A[i], v);
} else {
// 해시 테이블에 존재하지 않는 Key의 경우 Vector를 새로 할당받아
// 해당 인덱스 값을 Vector에 추가하여 해시에 넣어준다.
Vector<Integer> v = new Vector<Integer>();
v.add(i);
hm.put(A[i], v);
}
}
// 해시에 들어간 값들 중 Dominator조건에 만족하는 Key값을 찾는다.
for(Map.Entry<Integer, Vector<Integer>> elem : hm.entrySet()) {
if(elem.getValue().size() >= (A.length / 2) + 1) {
// 존재하는 경우 Dominator를 값으로 하는 인덱스 위치중 첫번째 위치를 정답으로 한다.
result = elem.getValue().get(0);
}
}
return result;
}
}
반응형
'Algorithm > 문제' 카테고리의 다른 글
MaxDoubleSliceSum (Codility) - Java (2) | 2020.07.31 |
---|---|
EquiLeader (Codility) - Java (0) | 2020.07.29 |
StoneWall (Codility) - Java (2) | 2020.07.25 |
Triangle (Codility) (0) | 2020.07.22 |
NumberOfDiscIntersections (Codility) (4) | 2020.07.21 |
Comments