โ๏ธ ๋ฌธ์

๐ข ์๊ณ ๋ฆฌ์ฆ
#์๋ฎฌ๋ ์ด์ #ํด์๋งต
๐คฏ ํ์ด ๋ฐฉ๋ฒ
<๋ฌธ์ ๋ถ์>
points: ์ด์ก ํฌ์ธํธ๋ค์ ์ขํ
routes: ๋ก๋ด์ด ์ด๋ ํฌ์ธํธ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋์ง
์ฐพ์์ผ ํ๋ ๊ฒ: ์ํ ์ํฉ์ ๋ฐ์ ํ์
1) ๊ฐ๊ฐ์ route์ ๋ํด์ ๊ฒฝ๋ก ๋ฐฐ์ด์ ๋ง๋ ๋ค. (์ด๋ ํฌ์ธํธ ์ด์ฉํด์)
- ์ํํ ๋ ์ธ๋ฑ์ค๋ฅผ ์ ์ฒด ๊ฐ๋ณด๋ค ํ๋ ์๊ฒ ์ก์์ ํ์ฌ ๊ฐ ๊ธฐ์ค์ผ๋ก ๋ค์ ๊ฐ๊น์ง ์ด๋ ๊ฒฝ๋ก๋ฅผ ์ฒดํฌํ๊ฒ ํจ
2) ๋ง๋ค์ด์ง ๊ฒฝ๋ก ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ณ๋ก ํ์ธํด์ ๊ฒน์น๋ฉด ์ํ ์ํฉ +1, ๋ฐ๋ณต๋ฌธ ์ข
๋ฃ
- ๊ฐ์ ์ขํ์ ๋ง์ ๊ฐ์ด ์ถฉ๋ํด๋ ํ๋์ ์ถฉ๋๋ก ์ฒดํฌํด์ HashMap ์ฌ์ฉํด์ ๊ฒฝ๋ก์ ๋ํ ๋ฑ์ฅ ํ์๋ฅผ ์ธ๋ ๋ฐฉ์์ผ๋ก ํ์
๊ฒฝ๋ก ๊ณ์ฐ์?
ex) 1,4์์ 6,4๋ก ์ด๋ํ๋ ค๋ฉด: r ํ๋์ฉ ์ฆ๊ฐ
๊ธฐ๋ณธ์ ์ผ๋ก ํ ๋จผ์ ์ด๋, ๊ทธ๋ค์ ์ด ์ด๋
<์ฃผ์ํ ์ >
- ์ฒ์์๋ ์ ์ฒด ๊ฒฝ๋ก์ ์๋ฅผ ์ธ์ ๊ทธ๊ฑธ ํ๋์ฉ ๋นผ๋ ๋ฐ๋ณต๋ฌธ์ ๋๋ ธ๋๋ฐ, ๋๋ฒ๊น ์ ํ๋ค๊ฐ ๋งค ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ๋ฐํด์ฉ ๋๋ฆฌ๋ ๊ฒ์ด ๋จธ๋ฆฟ์์์ ์๋ฎฌ๋ ์ด์ ํด๋ณด๊ธฐ์ ๋ ํธํ๋ค๊ณ ๋๊ปด์ก๋ค.
- points ๋ฐฐ์ด์์ ์ขํ ๊ฐ์ ๊ฐ์ ธ์ฌ๋ clone()์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์๋ณธ ๋ฐฐ์ด์ ๊ฐ์ ๋ฐ๊ฟ์ ์ฐธ์กฐ๊ฐ ์ค๋ฅ ๋ฐ์
- ์ ์๋๋ ๊ฐ ์ธ๋ฑ์ค๊ฐ 1๋ถํฐ ์์๋๋ฏ๋ก ์ธ๋ฑ์ค๋ฅผ ์ก์ ๋ ์ ์ผ์น์์ผ์ผ ํ๋ค
- HashMap์ key๋ฅผ int[]๋ก ์ก์ผ๋ฉด ๊ฐ์ ๊ฐ์ฒด๋ก ์ธ์ํ์ง ์๋๋ค. List<Integer> ์ฌ์ฉ
๐พ ๊ตฌํ ์ฝ๋ (์๋ฐ)
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public int solution(int[][] points, int[][] routes) {
int answer = 0;
int countRoutes = routes.length; // ๋ก๋ด์ ์
// ๊ฐ ๋ก๋ด์ด ์ด๋ค ๊ฒฝ๋ก๋ก ์ด๋ํ๋์ง ์ ์ฅํ๋ค
// key: ๋ก๋ด ์ธ๋ฑ์ค(0~routes.length - 1), value: ๊ฐ ๋ก๋ด์ ๊ฒฝ๋ก(int[])๋ฅผ ArrayList์ ์ ์ฅ
HashMap<Integer, ArrayList<int[]>> paths = new HashMap<>();
for (int idx = 0; idx < countRoutes; idx++) { // 0 ~ routes.length - 1๊น์ง ๋ก๋ด ์ํ
paths.put(idx, new ArrayList<int[]>()); // paths์ ๋ก๋ด ์ธ๋ฑ์ค key ์ฝ์
int[] route = routes[idx]; // route: ๋ก๋ด์ ์ด๋ ๊ฒฝ๋ก ๋ฐฐ์ด
int l = route.length; // l: ๊ฐ ๋ก๋ด์ด ๊ฑฐ์น๋ ํฌ์ธํธ์ ์
paths.get(idx).add(points[route[0] - 1].clone()); // ์์์ paths์ ์ฝ์
for (int i = 0; i < l - 1; i++) {
int[] cur = points[(route[i] - 1)].clone(); // ํ์ฌ ์ขํ
int[] next = points[(route[i + 1] - 1)].clone(); // ๋ค์์ ์ด๋ํ ์ขํ
while (cur[0] != next[0]) { // row
if (cur[0] < next[0]) {
cur[0] = cur[0] + 1;
paths.get(idx).add(new int[]{cur[0], cur[1]});
} else {
cur[0] = cur[0] - 1;
paths.get(idx).add(new int[]{cur[0], cur[1]});
}
}
while (cur[1] != next[1]) { // column
if (cur[1] < next[1]) {
cur[1] = cur[1] + 1;
paths.get(idx).add(new int[]{cur[0], cur[1]});
} else {
cur[1] = cur[1] - 1;
paths.get(idx).add(new int[]{cur[0], cur[1]});
}
}
}
}
// ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก ์ ๊ตฌํ๊ธฐ
int maxCnt = 0;
Set<Integer> keySet = paths.keySet();
for (Integer key : keySet) {
if (paths.get(key).size() > maxCnt) {
maxCnt = paths.get(key).size();
}
}
// ์ถฉ๋ ํ์ธ
for (int sec = 0; sec < maxCnt; sec++) { // ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก๋งํผ ์ํ (๋งค ์ด์ ํด๋น)
HashMap<List<Integer>, Integer> check = new HashMap<>(); // ๊ฐ ์๊ฐ๋ณ ๋ฑ์ฅ ๊ฒฝ๋ก count
for (int i = 0; i < countRoutes; i++) { // ๋ก๋ด ์์๋๋ก ํ์
if (paths.get(i).size() != 0) { // ๊ฒฝ๋ก๊ฐ ๋๋์ง ์์์ ๊ฒฝ์ฐ์๋ง
int[] target = paths.get(i).get(0);
List<Integer> targetList = Arrays.stream(target).boxed().collect(Collectors.toList());
if (check.containsKey(targetList)) { // ์ด๋ฏธ ๋์จ ๊ฑฐ๋ฉด + 1
check.replace(targetList, check.get(targetList) + 1);
} else {
check.put(targetList, 1);
}
paths.get(i).remove(0); // ๊ณ์ฐํ ๊ฒฝ๋ก๋ path์์ ์ญ์
}
}
for (List<Integer> key : check.keySet()) {
if (check.get(key) > 1) { // 2๋ฒ ์ด์ ๋ฑ์ฅํ ๊ฒฝ์ฐ ์ค๋ณต ๊ฒฝ๋ก๋ก count
answer++;
}
}
}
return answer;
}
}
๐ค GPT์ ์ฝ๋ ๊ฐ์ ์ ์
โ 1. paths.get(i).remove(0) ์ฑ๋ฅ ์ด์
๋ฌธ์
- ArrayList.remove(0)๋ O(n) ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ต๋๋ค. ์ด๋ฅผ maxCnt๋งํผ ๋ฐ๋ณตํ๊ฒ ๋๋ฉด ์ ์ฒด ์๊ฐ๋ณต์ก๋๋ O(R × maxLen²) ์์ค์ผ๋ก ๋์ด๋ฉ๋๋ค (R: ๋ก๋ด ์, maxLen: ๊ฒฝ๋ก ๊ธธ์ด).
- ๋ก๋ด ์๋ ๊ฒฝ๋ก ๊ธธ์ด๊ฐ ๋ง์์ง ๊ฒฝ์ฐ ์ฌ๊ฐํ ๋นํจ์จ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๐ง ํด๊ฒฐ ๋ฐฉ๋ฒ
- index ๊ธฐ๋ฐ ์๋ฎฌ๋ ์ด์ ์ผ๋ก ์ ํ (์ฌ๋ผ์ด์ฑ ๋์ ์ธ๋ฑ์ค๋ฅผ ์ฆ๊ฐ์ํค๋ ๋ฐฉ์)
โ 2. ์ขํ ๋น๊ต ์ List<Integer> → ๋ฌธ์์ด ๋๋ Pair ๊ตฌ์กฐ๋ก ๋จ์ํ
๋ฌธ์
- List<Integer>๋ก ์ขํ๋ฅผ ํํํ๊ณ Map ํค๋ก ์ฌ์ฉํ๋ ๊ฑด ๋ถํ์ํ๊ฒ ๋ฌด๊ฒ์ต๋๋ค.
๐ง ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์ขํ๋ฅผ ๋ฌธ์์ด "r,c" ํ์์ผ๋ก ์ฒ๋ฆฌํ๊ฑฐ๋, Objects.hash(r, c)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก, ์ฑ์ฉ๊น์ง Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
'Algorithm > programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[programmers] Lv.2 ๋น๋ฐ ์ฝ๋ ํด๋ (python) (0) | 2025.04.29 |
---|---|
[programmers] [PCCP ๊ธฐ์ถ๋ฌธ์ ] 2๋ฒ / ํผ์ฆ ๊ฒ์ ์ฑ๋ฆฐ์ง (java) (1) | 2025.04.16 |
[programmers][ํHeap] Lv.2 ๋ ๋งต๊ฒ (java) (0) | 2025.02.11 |
[programmers] [PCCE ๊ธฐ์ถ๋ฌธ์ ] 9๋ฒ / ์ด์ํ ์นธ (java) (0) | 2024.11.23 |
[programmers] [PCCP ๊ธฐ์ถ๋ฌธ์ ] 1๋ฒ / ๋ถ๋ ๊ฐ๊ธฐ (java) (1) | 2024.11.21 |