Leetcode Java Random Pick with Blacklist
업데이트:
문제
코드
class Solution {
private Random random;
private Map<Integer, Integer> map;
private int size;
public Solution(int n, int[] blacklist) {
this.random = new Random();
this.map = new HashMap<Integer, Integer>();
this.size = n - blacklist.length;
for (int blacklistNum : blacklist) {
if (blacklistNum >= this.size) {
this.map.put(blacklistNum, -1);
}
}
int index = n - 1;
for (int blacklistNum : blacklist) {
if (blacklistNum < this.size) {
while (this.map.containsKey(index--)) {
}
this.map.put(blacklistNum, index + 1);
}
}
}
public int pick() {
int num = this.random.nextInt(this.size);
return this.map.getOrDefault(num, num);
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(n, blacklist);
* int param_1 = obj.pick();
*/
결과
설명
- blacklist 내 값들을 제외한 [0, $n - 1$] 범위 내 값들을 동일한 확률로 반환하는 객체를 만드는 문제이다.
- 생성자인 Solution(int n, int[] blacklist)은 n과 blaclist를 이용하여 객체를 초기화한다.
- 메서드인 pick()은 [0, $n - 1$] 범위 내 값들 중 blacklist 외 값들을 동일한 확률로 반환하는 역할을 수행한다.
- 일반적으로 blacklist의 반의어는 whitelist라고 한다.
- 문제 풀이에 필요한 전역 변수를 정의한다.
- random은 객체 내 존재하는 값을 동일한 확률로 반환하기 위한 변수이다.
- map은 [0, $n - 1$] 범위 내 값들을 blacklist를 제외하고 값을 저장하기 위한 변수이다.
- size는 blacklist에 포함되지 않은 값들의 크기를 저장할 변수이다.
- 생성자인 Solution(int n, int[] blacklist)을 완성한다.
- 문제 풀이에 필요한 전역 변수를 초기화한다.
- random에 Random 객체를 초기화하여 넣어준다.
- map은 key와 value로 넣기 위해 HashMap으로 초기화한다.
- size는 blacklist를 제외한 값들의 길이를 구하기 위해 n에서 해당 길이를 빼서 저장한다.
- blacklist를 반복하여 size보다 큰 값이 key인 value에 -1을 넣어, blacklist에 포함되는 값임을 표시해준다.
- index는 [0, size] 범위에 포함되는 blacklist 값과 범위 외 whitelist 값을 key-value로 묶기 위한 값으로, 최대 숫자 범위인 $n - 1$로 초기화한다.
- blacklist의 모든 값들을 blacklistNum에 넣어 아래를 반복 수행한다.
- blacklistNum이 size보다 작은 경우, [0, size] 범위 밖의 whitelist 값과 key-value로 연동하기 위해서 다음을 수행하고 그렇지 않으면 반복을 계속 수행한다.
- map에 index가 key인 값이 존재하면 index를 감소시켜 blacklist에 포함되지 않은 값을 찾는다.
- 위의 반복이 완료되면 blacklistNum이 key인 value에 $index + 1$인 whitelist 값을 넣어준다.
- 문제 풀이에 필요한 전역 변수를 초기화한다.
- 메서드인 pick()을 완성한다.
- num에 [0, size] 내 임의 정수를 반환시킨다.
- map에서 num번째 값이 존재하는 경우 blacklist 값과 위치를 바꾼 whitelist 값을 가져오고, 존재하지 않는 경우 num인 whitelist 값을 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기