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

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] ์ˆซ์ž ๋ณ€ํ™˜ํ•˜๊ธฐ

by ์‚๋šค์˜ค๋ฆฌ 2025. 10. 22.

๋ฌธ์ œ ์„ค๋ช…

https://school.programmers.co.kr/learn/courses/30/lessons/154538

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

์ž์—ฐ์ˆ˜ x๋ฅผ y๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • x์— n์„ ๋”ํ•ฉ๋‹ˆ๋‹ค
  • x์— 2๋ฅผ ๊ณฑํ•ฉ๋‹ˆ๋‹ค.
  • x์— 3์„ ๊ณฑํ•ฉ๋‹ˆ๋‹ค.

์ž์—ฐ์ˆ˜ x, y, n์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, x๋ฅผ y๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”. ์ด๋•Œ x๋ฅผ y๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ return ํ•ด์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

  • 1 ≤ x ≤ y ≤ 1,000,000
  • 1 ≤ n < y

์ž…์ถœ๋ ฅ ์˜ˆ

x y n result
10 40 5 2
10 40 30 1
2 5 4 -1

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1

  • x์— 2๋ฅผ 2๋ฒˆ ๊ณฑํ•˜๋ฉด 40์ด ๋˜๊ณ  ์ด๋•Œ๊ฐ€ ์ตœ์†Œ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #2

  • x์— n์ธ 30์„ 1๋ฒˆ ๋”ํ•˜๋ฉด 40์ด ๋˜๊ณ  ์ด๋•Œ๊ฐ€ ์ตœ์†Œ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #3

  • x๋ฅผ y๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— -1์„ returnํ•ฉ๋‹ˆ๋‹ค.

 

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

import java.util.*;

class Solution {
    public int solution(int x, int y, int n) {
        // ์—ฐ์‚ฐ๊ฐ’๊ณผ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•  Queue ์ƒ์„ฑ
        Queue<int[]> queue = new LinkedList<>();
        // ์—ฐ์‚ฐ๊ฐ’์˜ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•  boolean ๋ฐฐ์—ด ์ƒ์„ฑ, y๋ฅผ ๋„˜๋Š” ์ˆซ์ž๋Š” ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†์Œ
        boolean[] visited = new boolean[y + 1];
        
        // [ํ˜„์žฌ ์ˆซ์ž, ์—ฐ์‚ฐ ํšŸ์ˆ˜]
        queue.add(new int[]{x, 0});
        visited[x] = true;
        
        // ์—ฐ์‚ฐ ๋ฐ˜๋ณต ์ง„ํ–‰
        while(!queue.isEmpty()) {
            int[] now = queue.poll();
            // ํ˜„์žฌ ์ˆซ์ž
            int num = now[0];
            // ์—ฐ์‚ฐ ํšŸ์ˆ˜
            int count = now[1];
            
            // ๋ชฉํ‘œ ์ˆซ์ž ๋„๋‹ฌ ์‹œ ์ข…๋ฃŒ
            if (num == y) {
                return count;
            }
            
            // ๋‹ค์Œ ๋‹จ๊ณ„ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ๋“ค
            int[] next = {num + n, num * 2, num * 3};
            
            for (int nxt : next) {
                // y๋ฅผ ๋„˜์ง€ ์•Š๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋งŒ ํƒ์ƒ‰ ์ง„ํ–‰
                if (nxt <= y && !visited[nxt]) {
                    visited[nxt] = true;
                    queue.add(new int[]{nxt, count + 1});
                }
            }
        }
        
        // y์— ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ -1
        return -1;
    }
}

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ•œ ๋ฐฉํ–ฅ

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ, ์ฃผ์–ด์ง„ ์ •์ˆ˜ x๋ฅผ ์‹œ์ž‘์œผ๋กœ +n, *2, *3 ์„ธ ๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ชฉํ‘œ ์ˆซ์ž y๋ฅผ ๋งŒ๋“œ๋Š” ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋ผ๋Š” ์ ์„ ํŒŒ์•…ํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” y์—์„œ x๋กœ ๊ฑฐ๊พธ๋กœ ์ค„์—ฌ๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด๋ณด๋ ค ํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด y์—์„œ n์„ ๋นผ๊ฑฐ๋‚˜, 2 ๋˜๋Š” 3์œผ๋กœ ๋‚˜๋ˆ„๋ฉด์„œ x๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์‹์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๊ณ , ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ๋ง‰ํžˆ๋Š” ์ง€์ ์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

์ด์— ๋ฐ˜ํ•ด x์—์„œ y๋กœ ๊ฐ€๋Š” ์ •๋ฐฉํ–ฅ ํƒ์ƒ‰์€ ์—ฐ์‚ฐ์ด ๋‹จ์ˆœํ•˜๊ณ , “์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜”๋ฅผ ์ฐพ๋Š” ๋ฐ ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํŠนํžˆ BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ•œ ๋‹จ๊ณ„์”ฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋จผ์ € y์— ๋„๋‹ฌํ•˜๋Š” ์ˆœ๊ฐ„์ด ๊ณง ์ตœ์†Œ ํšŸ์ˆ˜๋ผ๋Š” ์ ์—์„œ ํšจ์œจ์ ์ด๋‹ค.

๊ตฌํ˜„์€ Queue๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ (ํ˜„์žฌ ์ˆซ์ž, ์—ฐ์‚ฐ ํšŸ์ˆ˜) ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ณ , ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค +n, *2, *3์„ ์ˆ˜ํ–‰ํ•ด ์ƒˆ๋กœ์šด ์ˆซ์ž๋ฅผ ํ์— ๋„ฃ์—ˆ๋‹ค. ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ˆซ์ž๋Š” boolean[] visited๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์ค‘๋ณต ํƒ์ƒ‰์„ ๋ง‰์•˜๋‹ค. ๋˜ํ•œ, ํƒ์ƒ‰ ๋„์ค‘ num == y๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„ ๋ฐ”๋กœ return count;๋กœ ์ข…๋ฃŒํ•ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๋„๋ก ํ–ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํ•œ ์ˆ˜์‹ ๊ณ„์‚ฐ์ด ์•„๋‹ˆ๋ผ, ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ ๊ฒฝ๋กœ ์ค‘ ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋ฉฐ, BFS๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํ•ต์‹ฌ์ด์—ˆ๋‹ค.