1. ๋ฌธ์ ์ค๋ช ๐
๋ฌธ์ ์ ์ค๋ช
๋ง ๋ณด๋ฉด ์ดํดํ๊ธฐ๊ฐ ์ด๋ ค์ด๋ฐ, ๋ฐ์ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋ณด๋ฉด ๋ฌธ์ ์์ ์ฃผ์ด์ง ์กฐ๊ฑด๊ณผ ๋ก๋ด์ ์๋์๋ฆฌ๋ ์ดํดํ ๋งํ๋ค.
ํ์ง๋ง ํท๊ฐ๋ฆฌ๋ ๊ฒ์ด ์๋ค๋ฉด ๋ฐ๋ก, points
์ routes
์ ์๋ฏธ ๋ฐ ๊ด๊ณ๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
(1) ํท๊ฐ๋ฆฌ๋ ๊ฒ ๋ฐ๋ก ์ก๊ธฐ
points
: ๋ก๋ด์ด ๋ฐฉ๋ฌธํด์ผํ๋ ์ง์ ์ ์ขํ๋ฅผ ๋ฐฐ์ด ํํ๋ก ์ ์ฅํด๋์๋ค.
points[i]์ผ ๋, ์ดi
๊ฐ ๋ฐฉ๋ฌธํ ์ง์ ์ ๋ฒํธ ์ด๊ณ , point[i]์value
๊ฐ ๊ฐ๊ฐ i๋ ์ง์ ์ ํ๊ณผ ์ด ์ฆ ์ขํ์ด๋ค.routes
; ๋ก๋ด๋ณ๋ก ๋ฐฉ๋ฌธํด์ผํ ์ง์ ์ ์์๋๋ก ๋์ดํ 1์ฐจ์ ๋ฐฐ์ด์ ๋ฌถ์์ด๋ค.
routes[i]์i
๋ ๋ก๋ด์ ๋ฒํธ์ด๊ณ , routes[i]์๋ ๋ก๋ด์ด ๋ฐฉ๋ฌธํด์ผํ ์ง์ ์ ๋ฒํธ๊ฐ ์์๋๋ก ์ ์ฅ๋์ด ์๋ค.
์๋ฅผ ๋ค์ด, routes[2] = {3,4,1,2} ์ด๋ฉด 2๋ฒ ๋ก๋ด์ ์ง์ ์ 3 โ 4 โ 1 โ 2 ๋ฒ ํํ๋ก ๋ฐฉ๋ฌธํด์ผ ํ๋ ๊ฒ์ด๋ค.
์์ ๋ด์ฉ์ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋ค์๊ณผ ๊ฐ๋ค๋ฉด 1,2,3๋ฒ ๋ก๋ด์ ์ด๋ป๊ฒ ์์ง์ผ๊น?1๋ฒ ๋ก๋ด
์ (2,2) โ (4,4)๋ก, 2๋ฒ ๋ก๋ด
์ (1,3) โ (4,4)๋ก, 3๋ฒ ๋ก๋ด
์ (2,5) โ (4,4) ๋ก ์์ง์ธ๋ค. ์ด๊ฒ ๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ์ข ๋์๋ฐ, ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ฉด ์์ชฝ ๋ค ๋ฐฐ์ด๋ก ์ด๋ฃจ์ด์ ธ ์์ด์, ์ฝ๋ ์งค ๋ ํท๊ฐ๋ฆฌ๊ฒ ๋ง๋ ๋ค.
- ๋จผ์ 2์ฐจ์ ๋ฐฐ์ด ํ์์ด๋ผ, ์ขํ๋ฅผ [0] [0], [0] [1] ์ด๋ ๊ฒ ๋ฐ๋ก๋ฐ๋ก ๋ถ๋ฌ ๋ฃ์ด์ผ ํ๋ ๊ฒ
routes
์ ๋ณด๋ฉด ๋ฐฉ๋ฌธ ์ง์ ๋ฒํธ๊ฐ 1๋ถํฐ ์์์ธ๋ฐ,points
๋ 0๋ถํฐ ์์ํ๋ ๊ฒ ๋ฑ์ด๋ค.
๋ฐ๋ผ์ ์ด๋ ๊ฒ ๋ฐ๋ก ์ก๋๋ค.
(1) ์ขํ๋ Loc
์ด๋ ๊ฐ์ฒด๋ก ๋ฌถ์ด ๋๋๋ค. Loc์ Location์ ์ฝ์๋ก ํด๋์ค๋ช
์ผ๋ก ๊ณจ๋๊ณ , ์ขํ๋ก ์ณค์ ๋, y๊ฐ์ r, x๊ฐ์ c์ ๋ฃ๋๋ค.
(2) Points
๋ HashMap
์ผ๋ก ๋ณ๋ชจ์ํจ๋ค.
๊ทธ ์ด์ ๋ ์๋๋ผ๋ฉด points[routes[i] [j]] [0]
, points[routes[i] [j]] [1]
์ด๋ฐ์์ผ๋ก i๋ฒ ๋ก๋ด์ j๋ฒ์งธ ๋ฐฉ๋ฌธ ์ง์ ์ ์ขํ๋ฅผ ๊ณจ๋ผ์ผ ํ๋๋ฐ, ๊ฐ๋
์ฑ์ด ๋จ์ด์ ธ ์ค์ํ๊ธฐ๊ฐ ์ฝ๋ค. ๋ฐ๋ผ์ HashMap<Integer, Loc>
์ผ๋ก ๋์ด์ ์ง์ ๋ฒํธ๋ณ ์ขํ๋ฅผ ์ ์ฅํด, map.get(routes[i][j])
ํ๋ฉด ํด๋น ์ขํ๊ฐ ๋ฐ๋ก ๋์ค๊ฒ ํ๊ฒ ๋ค.
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: SIMULATION
2์ฐจ์ ๋ฐฐ์ด ํฌ๊ธฐ๋ 100 X 100 ์ด ์ต๋์ด๊ณ , ๋๋จธ์ง ๋ฒ์ ๊ฐ๋ค๋ 100์ด ์ต๋๋ผ์ ๋จ์ ๊ตฌํ์ผ๋ก ํ์ด๋ ํ๋ฆฐ๋ค. (์ฌ์ค ์ฒ์์ 3์ฐจ์ ๋ฐฐ์ด๋ก ํธ๋ ๋ฐฉ์๋ ๋จ์ ๊ตฌํ์ด์์ง๋ง ์๊ฐ์ด๊ณผ๊ฐ ๋์๋ค... ใทใท ์ด๊ฑด ์ ์๋์๋์ง ๋ค์ ๊ฐ์ ์ค๋ช ํ๊ฒ ๋ค.)
(1) ๋ ผ๋ฆฌ ์ค๋ช (ํํธ๋ง ๋ณผ ๋ถ์ ์ฌ๊ธฐ๊น์ง๋ง ์ฝ๊ธฐ)
๋จผ์ ์ด๋ป๊ฒ ์ ๊ทผํ ๊ฒ์ธ์ง ๋๋ต์ ์ธ ํฐ ๊ทธ๋ฆผ์ ์ค๋ช
ํ๊ณ , ๊ทธ์ ๋ง๊ฒ ๊ตฌํ๋ ์ฌํญ์ ์ค๋ช
ํ๋ ค๊ณ ํ๋ค.
๋
์ ์ค ํํธ๋ง ์ป๊ณ ์ถ์ ๋ถ์ ์ด๊น์ง๋ง ์ฝ๊ณ ๋ค์ ๋ฌธ์ ๋ฅผ ํ๋ฌ๊ฐ๊ธฐ ๋ฐ๋๋ค.
์์์ ๋ด๊ฐ 3์ฐจ์ ๋ฐฐ์ด๋ก ํ์ด์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค๊ณ ํ๋๋ฐ, ๋ด๊ฐ ์ฒ์ ์๊ฐํ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ชจ๋ ๋ก๋ด ๋ณ๋ก ์์ ์ ์์ง์์ ํํํ 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ๋๋ค. ๊ทธ๋ฌ๋๊น 3์ฐจ์ ๋ฐฐ์ด์ ๊น์ด๋ ๋ก๋ด์ ๊ฐ์์ด๋ค.
- ๋ก๋ด์ ํ์ฌ ๋ฐฉ๋ฌธ ์ง์ ์ 1, ๋๋จธ์ง๋ 0์ผ๋ก ๊ธฐ๋กํ๋ค.
- ํ ๋ฒ์ ์์ง์ ์ดํ์, ๊ฒน์น๋ ๋ถ๋ถ์ ์ฒดํฌํ๋ค. ๋ง์ฝ ๋ก๋ด ์ค ์ต์ ๋๊ฐ๊ฐ (a,b) ์ง์ ์์ ๋ถ๋ชํ๋ค๋ฉด,(a,b,0) ~ (a,b, routes.length)๊น์ง ๋ณด์์ ๋, ๊ฐ์ด 1์ธ ์ง์ ์ด ์ต์ 2๊ฐ ์ด์ ๋์ฌ ๊ฒ์ด๋ค.
๋น์ฐํ ํด๋น ๋ฐฉ์์ ์์ง์ ํ ๋ฒ ๋ง๋ค 3์ฐจ์ ๋ฐฐ์ด์ ๋ค ํ์ํด์ผ ํ์์ผ๋ก ์๋ฌด๋ฆฌ ๋ฒ์๊ฐ ์์๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค.
์์ ์๊ฐ์ด๊ณผ๊ฐ ์ฃผ๋ ๊ตํ์ ์ค์๊ฐ์ผ๋ก ์ถฉ๋์ฌ๋ถ๋ฅผ ํ์ํด์๋ ์๋๋ค.
์ด๋ค. ์ด๋ฌ๋ฉด ๋งค๋ฒ ๋ชจ๋ ๋ถ๋ถ์ ๋ํ ํ์์ด ํ์ํด์ ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ํด์ค์ผ ํ ๊ฒ์ ๋ก๋ด ๋ณ๋ก ๋ง์ง๋ง point ๋ฐฉ๋ฌธ๊น์ง์ ์ง๋๊ฐ๋ ๋ชจ๋ ์ขํ๋ฅผ 0์ด ~ N์ด๊น์ง ์์๋๋ก ์ ์ฅํด๋๊ณ ๋ง์ง๋ง์ ๋ชฐ์์ ์ถฉ๋์ฌ๋ถ ํ์ธ
์ผ๋ก ๊ฐ์ผ ํ๋ค. ๊ทธ๋ฌ๋๊น ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๋ฌผ๋ฅ ์ผํฐ ์ง์์ด๋ผ๋ฉด ์ถฉ๋ ๋ ๋๋ง๋ค ๋ก๋ด ๊ด๋ฆฌ ์์คํ
์ ๊ธฐ๋กํ์ง ๋ง๊ณ , ํด๊ทผ ์ ์ CCTV๋ฅผ ๋๋ ค๋ณด๋ฉฐ ๋ชฐ์์ ์ถฉ๋ ํ์๋ฅผ ๊ธฐ๋กํ๋ ๊ฒ์ด๋ค. (์ง์ง ํ์ฌ์์ ์ด๋ ๊ฒํ๋ฉด ์งค๋ฆฌ๊ฒ ์ง๋ง ๋ง์ด๋ค.) ๊ทธ๋ผ ์ด์ ์ด๋ป๊ฒ ๋ชฐ์์ ํ์ธํ ๊ฒ์ธ์ง ์์๋ณด์
(2) ๊ตฌํ ์ค๋ช
- ๋ก๋ด ๋ณ๋ก Queue๋ฅผ ๋ง๋ค์ด์ ๋งค ์ด๋ง๋ค ์์ง์ธ ์ขํ๋ฅผ ์ ์ฅํ๋ค.
(์ต๋จ ๊ฒฝ๋ก๋ผ ํ์ง๋ง ์ซ ํ์ ์๋ค. ๋งจํคํผ ๊ฑฐ๋ฆฌ์ธ๋ฐ๋ค๊ฐ, ๋์ฐฉ์ง๊ฐ ์ ํด์ ธ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋๋ถํฐ ์ฐ์ ํด์ ๊ฐ๋ผ๊ณ ๋ ์๋ ค์ค๋ค. ์ด๊ฑด ๊ทธ๋ฅ ํ์ผ๋ก 1, ์ด๋ก 1์ฉ ๋ํ๋ฉฐ ๋์ฐฉ์ง๊น์ง ๊ฐ๋ ๊ณ์ฐ์ ์ง์ ํ๋ผ๋ ์๋ฆฌ์ด๋ค. (์ด๋ ๊ฒ ๋ชจ๋ ์ง์ ์ ์ํํ๋ค.)) - ๋ชจ๋ ๋ก๋ด์ ์์ง์ ์ ์ฅ์ด ๋๋๋ฉด, 1์ด๋ง๋ค ๋์์ ๋ก๋ด ๋ณ queue์ front ๋ถ๋ถ์์ ๊ฐ์ ๊บผ๋ด์ ๊ฐ์ ์ขํ์ ์กด์ฌํ๋์ง ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ค. -> ๊ฐ์ ์ขํ๊ฐ ์กด์ฌํ๋ฉด ์ถฉ๋์ด๋ฏ๋ก ์ถฉ๋ํ์๋ฅผ 1 ์ฌ๋ฆฐ๋ค.
(๊ฐ์ ์ขํ๊ฐ ์กด์ฌํ๋์ง ํ์ธ์ด ์ด๋ ค์ธ ์ ์๋ค. ์ด๋๋๋ช ๋ถ ์์ฑ
์ด ํ์ํ๋ค. <Loc, Integer> ์ฆ <์ขํ, ํ์> ํํ์ map์ ๋ง๋ค์ด์ ์ขํ๋ณ๋ก ๋ก๋ด์ด ๋ฑ์ฅํ ํ์๋ฅผ ์ธ๊ณ ๊ทธ๊ฒ์ด 2 ์ด์์ด๋ฉด ์ถฉ๋ํ์๋ฅผ ์ฌ๋ฆฌ๋ฉด ๋๋ค.)
(3) ํ์ํ ์ฌ์ ์ง์
HashMap์ด KEY์ ๊ณ ์ ์ฑ์ ๋ณด์ฅํ๋ ์๋ฆฌ
: Key๋ก ํน์ ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋ ์, ๋ฉค๋ฒ ๋ณ์๊ฐ ๋์ผํด์ ์๋ฏธ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ฒด๋ HashMap์ด ๋์ผํ Key๋ก ๊ฐ์ฃผํ๋๋ก hashCode()์ equals()๋ฅผ ์ฌ์ ์ ํด์ค์ผ ํ๋ค.
HashMap์์ ๊ฐ์ฒด Key๋ฅผ ์ฐ๋๋ผ๋ Key์ ๋จ์ผ์ฑ์ ์ ์งํ๋ ๋ฐฉ๋ฒ โฌ (์ฌ์ ์ง์ ํ์ํ์ ๋ถ์ ํด๋ฆญ!)ArrayDeque, HashMap ๋ฑ ์๋ฃ ๊ตฌ์กฐ ํ์ฉ๋ฒ
: ํด๋น ๋ฌธ์ ๋ 80% ์ด์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ๋ฌธ์ ๋ฅผ ํ๊ณ ์์์ผ๋ก ์ดํด๊ฐ ํ์ํ๋ค.
3. ์ฝ๋ ์๊ฐ ๐
๋จผ์ ์ ์ฒด ์ฝ๋๋ฅผ ์๊ฐํ ๋ค์, ํจ์ ๋ณ๋ก ์ฝ๋์ ์๋์๋ฆฌ ๋ฐ ์๋ฏธ๋ฅผ ์์๋ณด๋๋ก ํ๊ฒ ๋ค.
import java.io.*;
import java.util.*;
class Solution {
public int solution(int[][] points, int[][] routes) {
// 0. initialize
// (robotTraker = store the way robots move), (map = store point locations),
// (longestDest = longest move among robot's move)
ArrayDeque<Loc> [] robotTrackers = new ArrayDeque [routes.length];
HashMap<Integer,Loc> dest = new HashMap<>();
int longestDest = 0;
for(int i = 0; i < points.length; i++){
dest.put((i+1), new Loc(points[i][0], points[i][1]));
}
for(int i = 0; i < routes.length; i++){
robotTrackers[i] = new ArrayDeque<Loc>();
trackingLocation(dest, routes[i], robotTrackers[i]);
longestDest = Math.max(longestDest, robotTrackers[i].size());
}
return countingCrush(robotTrackers, longestDest);
}
// store one robot's move from the start to the end
public void trackingLocation (HashMap<Integer, Loc> dest, int [] route, ArrayDeque<Loc> tracking) {
for(int i = 1; i<route.length; i++){
Loc start = dest.get(route[i-1]);
Loc next = dest.get(route[i]);
int r = start.r;
int c = start.c;
if(tracking.isEmpty()){
tracking.add(new Loc(r,c));
}
while(r != next.r){
r = (r<next.r? r+1 : r-1);
tracking.add(new Loc(r,c));
}
while(c != next.c){
c = (c<next.c? c+1 : c-1);
tracking.add(new Loc(r,c));
}
}
}
public int countingCrush (ArrayDeque<Loc> [] robotTrackers, int longestDist) {
int res = 0;
for(int i = 0; i < longestDist; i ++){
// store crush cnt of each location
HashMap<Loc, Integer> map = new HashMap<>();
int cnt = 0;
for(int j = 0; j < robotTrackers.length; j++){
if(robotTrackers[j].isEmpty()) continue;
Loc now = robotTrackers[j].poll();
map.compute(now, (key, oldvalue) -> (oldvalue == null? 1 : map.get(key)+1));
}
for(Integer v : map.values()){
if(v >= 2) cnt++;
}
res += cnt;
}
return res;
}
}
class Loc {
int r;
int c;
public Loc(int r, int c) {
this.r = r;
this.c = c;
}
public Loc(int r, int c, int nextPoint){
this.r = r;
this.c = c;
}
// to make Loc instance equal to another Loc instance which have same materials
@Override
public boolean equals (Object obj) {
if(this == obj) return true;
if(obj == null || this.getClass() != obj.getClass()) return false;
Loc o = (Loc) obj;
return (this.r == o.r && this.c == o.c);
}
@Override
public int hashCode() {
return Objects.hash(r,c);
}
}
์ด์ ํ๋์ฉ ์์๋ณด์.
(0) Loc ํด๋์ค
class Loc {
int r;
int c;
public Loc(int r, int c) {
this.r = r;
this.c = c;
}
public Loc(int r, int c, int nextPoint){
this.r = r;
this.c = c;
}
// to make Loc instance equal to another Loc instance which have same materials
@Override
public boolean equals (Object obj) {
if(this == obj) return true;
if(obj == null || this.getClass() != obj.getClass()) return false;
Loc o = (Loc) obj;
return (this.r == o.r && this.c == o.c);
}
@Override
public int hashCode() {
return Objects.hash(r,c);
}
}
๋ก๋ด์ด ์กด์ฌํ๋ ์ขํ ํน์ ํฌ์ธํธ์ ์ขํ๋ฅผ ์ ์ฅํด๋ ํด๋์ค์ด๋ค. ๋ฐฐ์ด๋ก๋ง ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋
์ฑ์ด ๋์ ์ฉ์ดํ๋ค. ์๊น๋ ๋งํ๋ฏ, ๋์ค์ ์ขํ ๋ณ๋ก ์กด์ฌํ๋ ๋ก๋ด์ ๊ฐ์
๋ฅผ ์ธ๊ธฐ ์ํด Loc์ HashMap์ Key๊ฐ ๋์ด์ผ ํ๋ค. ๋ฐ๋ผ์ equals์ hashCode๋ฅผ ์ฌ์ ์ ํด์ค์ผ ํ๋ค.
HashMap์ด ๋ Key์ ๋๋ฑ์ฑ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ ๊ฒฝ์ฐ ๋ค์ 2๊ฐ์ง ์์์ ๋ฐ๋ผ ํ์ธํ๋ค.
- ๋ค์ด์จ Key์ ์ด๋ฆ์ด B๋ผ๋ฉด, B๊ฐ ์ ์ฅ๋ HashBucket์ผ๋ก ์ผ๋จ ๋ค์ด๊ฐ๋ค.
๋๋ฑํ ๊ฐ์ฒด๋ค์ ๊ฐ์ HashBucket์ ์ ์ฅ๋๋ค. ๋ฐ๋ผ์ ์๋ฏธ์ ์ผ๋ก ๋๋ฑํ์ฌ ๋๋ฑ์ฑ์ ๋ถ์ฌํ ๊ฐ์ฒด๋ผ๋ฆฌ๋ ๊ฐ์ HashCode๋ฅผ ๊ฐ์ง๊ณ ๊ฐ์ Bucket์์ ๋ค์ด๊ฐ ์์ด์ผํจ. - ์ด์ ๊ฐ์ Bucket๋ด์์ B์ equals() ํ์ ๋ true๊ฐ ๋ฐํ๋๋ ๋
์์ด ์๋ค๋ฉด ๋์
๋๋ฑ
ํ Key์์ผ๋ก ํด๋น ๊ฐ์ value๊ฐ ๊ฐฑ์ ๋๋ค.
equals()
:
@Override
public boolean equals (Object obj) {
if(this == obj) return true; // ๋น๊ต๋์์ธ ์ธ์์ ํ์ฌ ๋์์ด ์์ ๊ฐ์ ๊ฐ์ด๋ค. -> ๋ฐ๋ก true ๋ฐํ
if(obj == null || this.getClass() != obj.getClass()) return false; // ๋น๊ต๋์ ๊ฐ์ด null์ด๊ฑฐ๋ ํ์ฌ ๊ฐ๊ณผ ํด๋์ค๊ฐ ๋ค๋ฅด๋ค๋ฉด false ๋ฐํ
Loc o = (Loc) obj; // ์ด์ ๊ฐ์ ํด๋์ค์ธ ๊ฒ๊น์ง๋ ํ์ธ ๋์์ผ๋, ๋ด์ฉ๋ฌผ(๋ฉค๋ฒ ๋ณ์)๊ฐ ๊ฐ์์ง ํ์ธ
return (this.r == o.r && this.c == o.c);
}
hashCode()
:
@Override
public int hashCode() {
return Objects.hash(r,c); // ๋ฉค๋ฒ ๋ณ์๋ฅผ ํ์ฉํด ํด์ฌ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ์, ๋ฉค๋ฒ ๋ณ์๊ฐ ๊ฐ์ ๋
์๋ค์ ๊ฐ์ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ๋ฐ์ ์์. ์ด๋ฅผ ์ด์ฉ
}
๋ง์ฝ ์ด๋ฌํ ๊ณผ์ ์ ๊ฑฐ์น์ง ์์ผ๋ฉด, hashCode()๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ๋ง๋ค์ด์ง์ผ๋ก, ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ hashCode๋ฅผ ๊ฐ์ก์ํ ๊ณ , ๊ทธ๋ ๋ค๋ฉด ๋๋ฑ์ฑ ๋น๊ต ์์ฒด๊ฐ ์๋๋ค. hashCode()๋ฅผ ์ฌ์ ์ ํ๋๋ผ๋, equals()๊ฐ ์ฌ์ ์ ๋์ด ์์ง ์๋ค๋ฉด, ๋ฉค๋ฒ ๋ณ์๊ฐ ๊ฐ์ ์๋ฏธ์ ์ผ๋ก ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์์ฑ์ง ๋ชปํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ก ๋๋ฑ์ฑ์ ์ฒดํฌํจ์ผ๋ก, ์๋ฏธ์ ์ผ๋ก ๊ฐ์ Key๋ฅผ ๋ฃ๋๋ผ๋ value๊ฐ ๊ฐฑ์ ๋๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด Entry๊ฐ ๊ณ์ ์๊ฒจ๋๋ค.
(1) solution method
์ ์ฒด๋ฅผ ๋ค๋ฃจ๋ ํจ์์ด๋ค.
public int solution(int[][] points, int[][] routes) {
// 0. initialize
// (robotTraker = store the way robots move), (map = store point locations),
// (longestDest = longest move among robot's move)
ArrayDeque<Loc> [] robotTrackers = new ArrayDeque [routes.length];
HashMap<Integer,Loc> dest = new HashMap<>();
int longestDest = 0;
for(int i = 0; i < points.length; i++){
dest.put((i+1), new Loc(points[i][0], points[i][1]));
}
for(int i = 0; i < routes.length; i++){
robotTrackers[i] = new ArrayDeque<Loc>();
trackingLocation(dest, routes[i], robotTrackers[i]);
longestDest = Math.max(longestDest, robotTrackers[i].size());
}
return countingCrush(robotTrackers, longestDest);
}
ArrayDeque<Loc> [] robotTracker
: ์์์๋ ๋งํ๋ฏ์ด Loc์ ์ขํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์ด๋ค. robotTracker[i]๋ i๋ฒ์งธ ๋ก๋ด์ด ์์ง์ธ ๊ฒฝ๋ก๋ฅผ Loc ํํ๋ก ์ ์ฅํ๊ณ ์๋ค. ArrayDeque๋ Queue์ ์ผ์ข
์ผ๋ก ์ ์
์ ์ถ ๊ตฌ์กฐ์ด๋ค. ๋ฐ๋ผ์ ๋งจ ์ฒ์ ์ด๋ํ ์์น๋ถํฐ ์ฐจ๋ก๋๋ก ArrayDeque์ ์๋ถ๋ถ์ ์ ์ฅ๋์ด์, ๋์ค์ ์๊ฐ ์์ผ๋ก ์ถฉ๋์ฌ๋ถ๋ฅผ ๋ฐ์ ธ๋ณผ ๋ ์ฉ์ดํ๋ค.
HashMap<Integer, Loc> dest
: dest๋ ํฌ์ธํธ ๋ฒํธ ๋ณ๋ก ์ขํ๋ฅผ ์ ์ฅํ๊ณ ์๋ HashMap์ด๋ค.
solution ํจ์์ ์๋ฆฌ
:
- ์์ ์ค๋ช ํ ๋ ์๋ฃ๊ตฌ์กฐ ์ด๊ธฐํ
trackingLocation
: ํจ์ ํ์ฉํ์ฌ ๋ก๋ด ๋ณ๋ก ์์ง์ธ ํ์ ์ ์ค๋๋ ์์ผ๋ก ์ ์ฅcountingCrush
: 2๋ฒ์์ ์ ์ฅํ ํ์ ์ ํ๋์ฉ ๋นผ๋ณด๋ฉด์ ์ถฉ๋ ํ์ ์ธ๊ธฐ
(2) Tracking Location
// store one robot's move from the start to the end
public void trackingLocation (HashMap<Integer, Loc> dest, int [] route, ArrayDeque<Loc> tracking) {
for(int i = 1; i<route.length; i++){
Loc start = dest.get(route[i-1]);
Loc next = dest.get(route[i]);
int r = start.r;
int c = start.c;
if(tracking.isEmpty()){
tracking.add(new Loc(r,c));
}
while(r != next.r){
r = (r<next.r? r+1 : r-1);
tracking.add(new Loc(r,c));
}
while(c != next.c){
c = (c<next.c? c+1 : c-1);
tracking.add(new Loc(r,c));
}
}
}
ํน๋ณํ ์ด๋ ค์ด ์๋ฆฌ๋ ์๋ค. ์์ point์์ ๊ทธ ๋ค์ point๊น์ง ํ ์ฐ์ ์ด๋์ ํ๋ค. ํ์นธ ์์ง์ผ ๋๋ง๋ค tracking์ด๋ RobotTracker ๋ฐฐ์ด ์ค ํ๋์ ๊ฐ์ ์์ง์์ ์ ์ฅํ๋ค. ํ point์ ๋์ฐฉํ๋ฉด ์ด์ ๊ทธ ํฌ์ธํธ๋ฅผ ์์์ ์ผ๋ก ๋ค์ ํฌ์ธํธ๊น์ง ์์ง์์ ๋ค์ ๊ธฐ๋กํ๋ค.
(3) countingCrush()
public int countingCrush (ArrayDeque<Loc> [] robotTrackers, int longestDist) {
int res = 0;
for(int i = 0; i < longestDist; i ++){
// store crush cnt of each location
HashMap<Loc, Integer> map = new HashMap<>();
int cnt = 0;
for(int j = 0; j < robotTrackers.length; j++){
if(robotTrackers[j].isEmpty()) continue;
Loc now = robotTrackers[j].poll();
map.compute(now, (key, oldvalue) -> (oldvalue == null? 1 : map.get(key)+1));
}
for(Integer v : map.values()){
if(v >= 2) cnt++;
}
res += cnt;
}
return res;
}
longestDist
: ๋ก๋ด๋ง๋ค ์์ง์ธ ๊ฑฐ๋ฆฌ๋ ์ฐจ์ด๊ฐ ๋ ์ ์๋ค. ๋ฐ๋ณต๋ฌธ์ ์์ง์์ด ๋๋ฝ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ๊ฐ์ฅ ๊ธธ์๋ ์์ง์์ ๋ฏธ๋ฆฌ ๊ธฐ๋กํด๋๊ณ ์ด๋ฅผ ์ด์ฉํด ๋ฐ๋ณต๋ฌธ์ ์งํํ๋ค.
HashMap<Loc, Integer> map
: ํ๋ฒ์ ์์ง์ ์ดํ ์ขํ๋ง๋ค ๋ก๋ด์ ๊ฐ์๋ฅผ ์ธ๊ธฐ ์ํ HashMap์ด๋ค. ๋ก๋ด์ด ํ์ฌ ์์นํ ์๋ฆฌ๋ง ํ๋ณด๊ตฐ์ผ๋ก ๋๊ณ ๊ฑฐ๊ธฐ์ ์ถฉ๋ ์ฌ๋ถ๋ฅผ ๊ณ์ฐํ๋ฉด ๋๋ฏ๋ก, ๋ด๊ฐ ์ฒ์ ์ ๋ณด์ธ 3์ฐจ์ ๋ฐฐ์ด ์ ์ฒด ํ์๋ณด๋ค ํจ์ฌ ํจ์จ์ ์์ ๋ ๋งํ๊ธฐ์ ์
์ด ์ํ๋ค.
๋งค ์ด ์์ง์ ๋ง๋ค map์ด ๋น์ด์ ธ ์์ด์ผ ํจ์ผ๋ก, ๋ฐ๋ณต๋ฌธ ์ ์ชฝ์์ ์ ์ธํ ๊ฒ์ ์์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋ค.
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
HashMap์ ๋๋ฑ์ฑ ๋ณด์ฅ
: ๊ฐ์ฒด๋ฅผ Key๋ก ์ธ ์ ์๋ค๋ ๊ฒ๋ ์ฒ์ ์์๊ณ , ์ด๋ฅผ ์ด์ฉํด HashMap์ ์ฐ๋ ค๋ฉด, equals์ hashCode()๋ฅผ ์ฌ์ ์ ํด์ค์ผ ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค. ์์ผ๊ฐ ๋์ด์ง๋ ๊ธฐ๋ถ์ด์๊ณ , ๋ค์์ ์ด๋ฅผ ํ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ์ด์ผ ๊ฒ ๋ค.