Leetcode Java Random Flip Matrix
업데이트:
문제
코드
class Solution {
private Map<Integer, Integer> map;
private int m;
private int n;
private int total;
private Random random;
public Solution(int m, int n) {
this.random = new Random();
this.m = m;
this.n = n;
this.reset();
}
public int[] flip() {
int num = this.random.nextInt(this.total--);
int value = this.map.getOrDefault(num, num);
this.map.put(num, this.map.getOrDefault(this.total, this.total));
this.map.put(this.total, value);
return new int[] { value / this.n, value % this.n };
}
public void reset() {
this.map = new HashMap<>();
this.total = this.m * this.n;
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(m, n);
* int[] param_1 = obj.flip();
* obj.reset();
*/
결과
설명
- $m \times n$ 크기의 이차원 배열은 모두 0으로 채워져 있으나, 특정 셀을 랜덤하게 선택하여 해당 행과 열을 배열로 반환하고 1로 뒤집는 Solution 클래스를 완성하는 문제이다.
- 생성자인 Solution(int m, int n)은 객체를 초기화하는 역할을 수행한다.
- 메서드인 flip()은 임의 셀을 선택하여 해당 값을 1로 변경 후, 해당 셀의 위치 값을 배열로 반환한다.
- 메서드인 reset()은 배열 내 값을 0으로 초기화하는 역할을 수행한다.
- 문제 풀이에 필요한 변수를 정의한다.
- map은 Fisher–Yates shuffle 방식을 활용하여 임의 위치의 값을 저장하기 위한 변수이다.
- m은 2차원 배열의 행, n은 열을 나타내고, total은 $m \times n$의 크기르 저장하기 위한 변수이다.
- random은 임의 위치를 동일한 확률로 탐색하기 위한 변수이다.
- 생성자인 Solution(int m, int n)을 정의한다.
- random에 Java의 Random 객체를 정의해 넣어준다.
- m과 n은 주어진 m과 n을 이용하여 값을 넣어주고, 5번에서 정의한 reset() 메서드를 호출하여 나머지 객체를 초기화한다.
- 메서드인 flip()을 정의한다.
- num에 random을 활용하여 0 ~ total 까지의 임의 숫자인 인덱스를 생성하고 total을 감소시킨다.
- value에 map 내 num이 키인 값이 있는지 확인하여 가져와 넣어주고, 없을 경우 num을 넣어준다.
- map 내 total이 키인 값이 있으면 해당 값을, 없을 경우 total을 map 내 num이 키인 값에 넣어준다.
- value를 행인 n으로 나누어 값을 행으로, 나머지를 열로 배열을 만들어 반환한다.
- 메서드인 reset()을 정의한다.
- map에 HashMap을 넣어 초기화한다.
- total에 2차원 배열의 크기인 $m \times n$을 넣어준다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기