๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๐Ÿ—‚๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด(Java)

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] ๋ฐฉ๋ฌธ ๊ธธ์ด

by ์‚๋šค์˜ค๋ฆฌ 2025. 8. 25.

๋ฌธ์ œ ์„ค๋ช…

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)์—์„œ ํ•ญ์ƒ ์ž‘์€ ์ชฝ ์ขŒํ‘œ๋ฅผ ์•ž์— ๋‘๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ž์—ด ํ‚ค๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ , ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐฉํ–ฅ์ด ๋‹ฌ๋ผ๋„ ๊ฐ™์€ ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋˜์–ด ํ•œ ๋ฒˆ๋งŒ ์ €์žฅ๋œ๋‹ค.

๋กœ์ง ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํ˜„์žฌ ์ขŒํ‘œ (x, y)์—์„œ ๋ช…๋ น ๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ์ฝ๊ณ , ์ด๋™ ํ›„๋ณด ์ขŒํ‘œ (nx, ny)๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  2. ํ›„๋ณด๊ฐ€ ๊ฒฝ๊ณ„ [-5, 5]๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ด๋™์„ ๋ฌด์‹œํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
  3. ํ›„๋ณด๊ฐ€ ์œ ํšจํ•˜๋ฉด, ํ˜„์žฌ ์ขŒํ‘œ์™€ ํ›„๋ณด ์ขŒํ‘œ๋กœ๋ถ€ํ„ฐ ์ •๊ทœํ™”๋œ ๊ฐ„์„  ํ‚ค๋ฅผ ๋งŒ๋“ค์–ด Set์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  4. ๊ทธ๋‹ค์Œ ์‹ค์ œ ์œ„์น˜๋ฅผ (nx, ny)๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.
    ๋ชจ๋“  ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•œ ๋’ค Set์— ๋‹ด๊ธด ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ณง ์ฒ˜์Œ ์ง€๋‚˜๊ฐ„ ๊ธธ์˜ ๊ฐœ์ˆ˜์ด๋ฏ€๋กœ ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์ด๋™ ๋ช…๋ น ๊ธธ์ด๋ฅผ n์ด๋ผ ํ•  ๋•Œ O(n)์ด๋‹ค. ๊ฐ ์ด๋™๋งˆ๋‹ค ๋ฌธ์ž์—ด ํ‚ค ์ƒ์„ฑ๊ณผ HashSet ์‚ฝ์ž…/์กฐํšŒ๊ฐ€ ํ‰๊ท  O(1)์ด๋ฏ€๋กœ ์ „์ฒด๋Š” ์„ ํ˜•์ด๋‹ค. ๊ณต๊ฐ„๋ณต์žก๋„๋Š” ์ €์žฅ๋˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ธธ์˜ ์ˆ˜๋ฅผ k๋ผ ํ•  ๋•Œ O(k)์ด๋ฉฐ, k๋Š” ์ตœ๋Œ€ n์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋ฌธ์ž์—ด ํ‚ค ์ƒ์„ฑ์— ๋”ฐ๋ฅธ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์žˆ์ง€๋งŒ, ์ขŒํ‘œ ๋ฒ”์œ„๊ฐ€ ์ž‘๊ณ  ์ž…๋ ฅ ๊ธธ์ด๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ํฌ์ง€ ์•Š์€ ๋ฌธ์ œ ํŠน์„ฑ์ƒ ์ถฉ๋ถ„ํžˆ ํšจ์œจ์ ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๋งŒ์•ฝ ๋ฌธ์ž์—ด ์ƒ์„ฑ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋” ์ค„์ด๊ณ  ์‹ถ๋‹ค๋ฉด, ์ž‘์€ Edge ํด๋ž˜์Šค์— equals/hashCode๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜, ์ •์ˆ˜ ํฌ๋งท(์˜ˆ: ๋น„ํŠธ ํŒจํ‚น)์œผ๋กœ ํ‚ค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด, ์ด ํ’€์ด๋Š” ๊ฒฝ๊ณ„ ์ฒดํฌ๋กœ ๋ฌดํšจ ์ด๋™์„ ๋ฐฐ์ œ, ๋ฌดํ–ฅ ๊ฐ„์„  ์ •๊ทœํ™”๋กœ ์™•๋ณต ์ค‘๋ณต ์ œ๊ฑฐ, Set์œผ๋กœ ์ฒ˜์Œ ์ง€๋‚˜๊ฐ„ ๊ธธ๋งŒ ์นด์šดํŠธํ•œ๋‹ค๋Š” ์„ธ ๊ฐ€์ง€ ํฌ์ธํŠธ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹์ด๋‹ค.