๋ฌธ์ ์ค๋ช
https://school.programmers.co.kr/learn/courses/30/lessons/49994
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
๊ฒ์ ์บ๋ฆญํฐ๋ฅผ 4๊ฐ์ง ๋ช ๋ น์ด๋ฅผ ํตํด ์์ง์ด๋ ค ํฉ๋๋ค. ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- U: ์์ชฝ์ผ๋ก ํ ์นธ ๊ฐ๊ธฐ
- D: ์๋์ชฝ์ผ๋ก ํ ์นธ ๊ฐ๊ธฐ
- R: ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ๊ฐ๊ธฐ
- L: ์ผ์ชฝ์ผ๋ก ํ ์นธ ๊ฐ๊ธฐ
์บ๋ฆญํฐ๋ ์ขํํ๋ฉด์ (0, 0) ์์น์์ ์์ํฉ๋๋ค. ์ขํํ๋ฉด์ ๊ฒฝ๊ณ๋ ์ผ์ชฝ ์(-5, 5), ์ผ์ชฝ ์๋(-5, -5), ์ค๋ฅธ์ชฝ ์(5, 5), ์ค๋ฅธ์ชฝ ์๋(5, -5)๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.

์๋ฅผ ๋ค์ด, "ULURRDLLU"๋ก ๋ช ๋ นํ๋ค๋ฉด

- 1๋ฒ ๋ช ๋ น์ด๋ถํฐ 7๋ฒ ๋ช ๋ น์ด๊น์ง ๋ค์๊ณผ ๊ฐ์ด ์์ง์ ๋๋ค.

- 8๋ฒ ๋ช ๋ น์ด๋ถํฐ 9๋ฒ ๋ช ๋ น์ด๊น์ง ๋ค์๊ณผ ๊ฐ์ด ์์ง์ ๋๋ค.

์ด๋, ์ฐ๋ฆฌ๋ ๊ฒ์ ์บ๋ฆญํฐ๊ฐ ์ง๋๊ฐ ๊ธธ ์ค ์บ๋ฆญํฐ๊ฐ ์ฒ์ ๊ฑธ์ด๋ณธ ๊ธธ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ค๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ ์์์์ ๊ฒ์ ์บ๋ฆญํฐ๊ฐ ์์ง์ธ ๊ธธ์ด๋ 9์ด์ง๋ง, ์บ๋ฆญํฐ๊ฐ ์ฒ์ ๊ฑธ์ด๋ณธ ๊ธธ์ ๊ธธ์ด๋ 7์ด ๋ฉ๋๋ค. (8, 9๋ฒ ๋ช ๋ น์ด์์ ์์ง์ธ ๊ธธ์ 2, 3๋ฒ ๋ช ๋ น์ด์์ ์ด๋ฏธ ๊ฑฐ์ณ ๊ฐ ๊ธธ์ ๋๋ค)
๋จ, ์ขํํ๋ฉด์ ๊ฒฝ๊ณ๋ฅผ ๋์ด๊ฐ๋ ๋ช ๋ น์ด๋ ๋ฌด์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, "LULLLLLLU"๋ก ๋ช ๋ นํ๋ค๋ฉด

- 1๋ฒ ๋ช ๋ น์ด๋ถํฐ 6๋ฒ ๋ช ๋ น์ด๋๋ก ์์ง์ธ ํ, 7, 8๋ฒ ๋ช ๋ น์ด๋ ๋ฌด์ํฉ๋๋ค. ๋ค์ 9๋ฒ ๋ช ๋ น์ด๋๋ก ์์ง์ ๋๋ค.

์ด๋ ์บ๋ฆญํฐ๊ฐ ์ฒ์ ๊ฑธ์ด๋ณธ ๊ธธ์ ๊ธธ์ด๋ 7์ด ๋ฉ๋๋ค.
๋ช ๋ น์ด๊ฐ ๋งค๊ฐ๋ณ์ dirs๋ก ์ฃผ์ด์ง ๋, ๊ฒ์ ์บ๋ฆญํฐ๊ฐ ์ฒ์ ๊ฑธ์ด๋ณธ ๊ธธ์ ๊ธธ์ด๋ฅผ ๊ตฌํ์ฌ return ํ๋ solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
์ ํ ์ฌํญ
- dirs๋ stringํ์ผ๋ก ์ฃผ์ด์ง๋ฉฐ, 'U', 'D', 'R', 'L' ์ด์ธ์ ๋ฌธ์๋ ์ฃผ์ด์ง์ง ์์ต๋๋ค.
- dirs์ ๊ธธ์ด๋ 500 ์ดํ์ ์์ฐ์์ ๋๋ค.
์ ์ถ๋ ฅ ์
| dirs | answer |
| "ULURRDLLU" | 7 |
| "LULLLLLLU" | 7 |
์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
- ๋ฌธ์ ์ ์์์ ๊ฐ์ต๋๋ค.
์ ์ถ๋ ฅ ์ #2
- ๋ฌธ์ ์ ์์์ ๊ฐ์ต๋๋ค.
๋ด๊ฐ ์์ฑํ ์ฝ๋
import java.util.*;
class Solution {
public int solution(String dirs) {
// ๋ฐฉ๋ฌธ ๊ธธ์ด๋ฅผ ์ ์ฅํ ๋ณ์ ์์ฑ
int answer = 0;
// ์์ ์ขํ (0, 0)
int x = 0, y = 0;
// ์ง๋๊ฐ ๊ธธ(๊ฐ์ )์ ์ ์ฅํ๋ Set
// ๋ฐฉํฅ์ ๋ฌด์ํ๊ณ ํ ๋ฒ๋ง ์ ์ฅํ๊ธฐ ์ํด ๋ฌธ์์ด key๋ก ๊ด๋ฆฌ
Set<String> path = new HashSet<>();
// ์ฃผ์ด์ง ์ด๋ ๋ช
๋ น์ ํ๋์ฉ ์ฒ๋ฆฌ
for (int i = 0; i < dirs.length(); i++) {
// ์ด๋ ๋ช
๋ น ๋ฐ์์ค๊ธฐ
char c = dirs.charAt(i);
// ์ด๋ ํ ์ขํ ์์น
int nx = x;
int ny = y;
// ๋ช
๋ น์ด์ ๋ฐ๋ผ ๋ค์ ์ขํ ๊ณ์ฐ
if (c == 'U') {
ny++;
} else if (c == 'D') {
ny--;
} else if (c == 'L') {
nx--;
} else if (c == 'R') {
nx++;
}
// ์ขํ ๋ฒ์๊ฐ -5 ~ 5 ์์ชฝ์ผ ๋๋ง ์ด๋ ๊ฐ๋ฅ
if (nx < -5 || nx > 5 || ny < -5 || ny > 5) {
continue;
}
// ์ด๋ํ ๊ธธ์ ์ ์ฅ (๋ฐฉํฅ๊ณผ ๊ด๊ณ์์ด ๋์ผํ ๊ธธ๋ก ์ฒ๋ฆฌ)
path.add(edgeKey(x, y, nx, ny));
// ์ค์ ์ขํ ๊ฐฑ์
x = nx;
y = ny;
}
// ์ง๋๊ฐ ๊ธธ ๊ฐ์ ์ ์ฅ
answer = path.size();
// ์ ๋ต ๋ฐํ
return answer;
}
// ๊ฐ์ ์ ๋ฐฉํฅ์ ๊ด๊ณ์์ด ๋์ผํ๊ฒ ์ ์ฅํ๊ธฐ ์ํ key ์์ฑ ๋ฉ์๋
private String edgeKey(int x1, int y1, int x2, int y2) {
// ์์ ์ขํ -> ํฐ ์ขํ ์์ผ๋ก ์ ๋ ฌํด์ ๋ฌธ์์ด ์์ฑ
if (x1 < x2 || (x1 == x2 && y1 <= y2)) {
return x1 + "," + y1 + "->" + x2 + "," + y2;
} else {
return x2 + "," + y2 + "->" + x1 + "," + y1;
}
}
}
๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ์๊ฐํ ๋ฐฉํฅ
์ฒ์ ๋ฌธ์ ๋ฅผ ๋ดค์ ๋, “์ขํ ํ๋ฉด์์ ์บ๋ฆญํฐ๊ฐ U/D/L/R๋ก ์ด๋ํ ๋ ์ฒ์ ์ง๋๊ฐ๋ ๊ธธ(๊ฐ์ )๋ง ๊ธธ์ด๋ก ์ผ๋ค”๋ ์ ์ด ํต์ฌ์ด๋ผ๊ณ ํ๋จํ๋ค. ๋ฐ๋ผ์ ์ (์ขํ) ๋ฐฉ๋ฌธ ์ฌ๋ถ๊ฐ ์๋๋ผ, ๋ ์ขํ ์ฌ์ด์ ๊ฒฝ๋ก ์์ฒด๊ฐ ์๋กญ๋๋ฅผ ํ๋ณํด์ผ ํ๋ค๊ณ ๋ณด์๋ค. ์์ ์ง์ ์ (0, 0)์ด๋ฉฐ, ์ขํ๋ -5๋ถํฐ 5๊น์ง๋ง ์ ํจํ๋ค๋ ์ ์ฝ์ด ์์ผ๋ฏ๋ก ๊ฒฝ๊ณ ๋ฐ์ผ๋ก ๋๊ฐ๋ ์ด๋์ ๋ฌดํจ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ์ ๋ฆฌํ๋ค.
์กฐ๊ฑด์ ๋ถ์ํด ๋ณด๋ฉด, ๋์ผํ ์ ๋ถ์ ์๋ณตํ์ ๋ (A → B)์ (B → A)๋ ๊ฐ์ ๊ธธ๋ก ๊ฐ์ฃผํด์ผ ํ๋ค. ๋ํ ์ด๋ ๋ช ๋ น์ ์์๋๋ก ์ํํ๋ฉด์, ๊ฐ ์ด๋์ด ์ ํจํ ๋๋ง “์ด๋ฒ ์ด๋์ผ๋ก ์์ฑ๋ ๊ธธ”์ ์ค๋ณต ์์ด ์ ์ฅํ๊ณ , ๋ง์ง๋ง์ ์ ์ฅ๋ ์๋ก ๋ค๋ฅธ ๊ธธ์ ๊ฐ์๋ฅผ ๋ฐํํ๋ฉด ๋๋ค. ์ด๋ ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋๋ ์ด๋์ ๊ธธ๋ก ์ธ์ง๋ ์๊ณ ์์น๋ ๋ฐ๊พธ์ง ์๋๋ค๋ ์ ์ด ์ค์ํ๋ค.
์๋ฃ๊ตฌ์กฐ๋ HashSet์ ์ ํํ๋ค. ์ด์ ๋ ์ฒซ์งธ, ์ด๋ฏธ ์ง๋๊ฐ ๊ธธ์ธ์ง ๋น ๋ฅด๊ฒ ํ์ธํ๊ธฐ ์ํด์์ด๊ณ , ๋์งธ, Set ํน์ฑ์ ์ค๋ณต์ ์๋์ผ๋ก ์ ๊ฑฐํด ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ธธ์ ๋ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฌดํฅ ๊ฐ์ ์ด๋ฏ๋ก, (x1, y1) - (x2, y2)์ (x2, y2) - (x1, y1)๊ฐ ๋์ผํ ํค๊ฐ ๋๋๋ก ์ ๊ทํ๊ฐ ํ์ํ๋ค. ๋ณธ ์ฝ๋๋ edgeKey(x1, y1, x2, y2)์์ ํญ์ ์์ ์ชฝ ์ขํ๋ฅผ ์์ ๋๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์์ด ํค๋ฅผ ๋ง๋ค์๊ณ , ์ด๋ ๊ฒ ํ๋ฉด ๋ฐฉํฅ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๋ฌธ์์ด์ด ์์ฑ๋์ด ํ ๋ฒ๋ง ์ ์ฅ๋๋ค.
๋ก์ง ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ฌ ์ขํ (x, y)์์ ๋ช ๋ น ๋ฌธ์ ํ๋๋ฅผ ์ฝ๊ณ , ์ด๋ ํ๋ณด ์ขํ (nx, ny)๋ฅผ ๊ณ์ฐํ๋ค.
- ํ๋ณด๊ฐ ๊ฒฝ๊ณ [-5, 5]๋ฅผ ๋ฒ์ด๋๋ฉด ์ด๋์ ๋ฌด์ํ๊ณ ๋ค์ ๋ช ๋ น์ผ๋ก ๋์ด๊ฐ๋ค.
- ํ๋ณด๊ฐ ์ ํจํ๋ฉด, ํ์ฌ ์ขํ์ ํ๋ณด ์ขํ๋ก๋ถํฐ ์ ๊ทํ๋ ๊ฐ์ ํค๋ฅผ ๋ง๋ค์ด Set์ ์ถ๊ฐํ๋ค.
- ๊ทธ๋ค์ ์ค์ ์์น๋ฅผ (nx, ny)๋ก ๊ฐฑ์ ํ๋ค.
๋ชจ๋ ๋ช ๋ น์ ์ฒ๋ฆฌํ ๋ค Set์ ๋ด๊ธด ๊ฐ์ ์ ๊ฐ์๊ฐ ๊ณง ์ฒ์ ์ง๋๊ฐ ๊ธธ์ ๊ฐ์์ด๋ฏ๋ก ์ด๋ฅผ ๋ฐํํ๋ค.
์๊ฐ๋ณต์ก๋๋ ์ด๋ ๋ช ๋ น ๊ธธ์ด๋ฅผ n์ด๋ผ ํ ๋ O(n)์ด๋ค. ๊ฐ ์ด๋๋ง๋ค ๋ฌธ์์ด ํค ์์ฑ๊ณผ HashSet ์ฝ์ /์กฐํ๊ฐ ํ๊ท O(1)์ด๋ฏ๋ก ์ ์ฒด๋ ์ ํ์ด๋ค. ๊ณต๊ฐ๋ณต์ก๋๋ ์ ์ฅ๋๋ ์๋ก ๋ค๋ฅธ ๊ธธ์ ์๋ฅผ k๋ผ ํ ๋ O(k)์ด๋ฉฐ, k๋ ์ต๋ n์ ๋์ง ์๋๋ค. ๋ฌธ์์ด ํค ์์ฑ์ ๋ฐ๋ฅธ ์ค๋ฒํค๋๋ ์์ง๋ง, ์ขํ ๋ฒ์๊ฐ ์๊ณ ์ ๋ ฅ ๊ธธ์ด๊ฐ ๊ณผ๋ํ๊ฒ ํฌ์ง ์์ ๋ฌธ์ ํน์ฑ์ ์ถฉ๋ถํ ํจ์จ์ ์ด๋ผ๊ณ ํ๋จํ๋ค. ๋ง์ฝ ๋ฌธ์์ด ์์ฑ ์ค๋ฒํค๋๋ฅผ ๋ ์ค์ด๊ณ ์ถ๋ค๋ฉด, ์์ Edge ํด๋์ค์ equals/hashCode๋ฅผ ์ ์ํ๊ฑฐ๋, ์ ์ ํฌ๋งท(์: ๋นํธ ํจํน)์ผ๋ก ํค๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ๋ ๋์์ด ๋ ์ ์๋ค.
์ ๋ฆฌํ๋ฉด, ์ด ํ์ด๋ ๊ฒฝ๊ณ ์ฒดํฌ๋ก ๋ฌดํจ ์ด๋์ ๋ฐฐ์ , ๋ฌดํฅ ๊ฐ์ ์ ๊ทํ๋ก ์๋ณต ์ค๋ณต ์ ๊ฑฐ, Set์ผ๋ก ์ฒ์ ์ง๋๊ฐ ๊ธธ๋ง ์นด์ดํธํ๋ค๋ ์ธ ๊ฐ์ง ํฌ์ธํธ๋ฅผ ์ผ๊ด๋๊ฒ ๊ตฌํํ ๋ฐฉ์์ด๋ค.
'๐ฆ ํ๋ก๊ทธ๋๋จธ์ค > ๐๏ธ ์๊ณ ๋ฆฌ์ฆ ํ์ด(Java)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] n์ง์ ๊ฒ์ (2) | 2025.09.02 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ๋ค์ ์๋ ํฐ ์ ์ฐพ๊ธฐ (2) | 2025.09.01 |
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ๋คํธ์ํฌ (6) | 2025.08.21 |
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ๋ชจ์์ฌ์ (2) | 2025.08.20 |
| [ํ๋ก๊ทธ๋๋จธ์ค/Java] ๋ด์ค ํด๋ฌ์คํฐ๋ง (4) | 2025.08.19 |