codingtest

숫자 변환하기

2026-08-23
2분 분량
JAVA프로그래머스

문제 링크

문제 요약

  • 자연수 x를 y로 바꾸는 데 x+n, x2, x3 세 가지 연산을 쓸 수 있다
  • x를 y로 바꾸는 최소 연산 횟수를 구하는 문제다
  • 만들 수 없으면 -1을 반환한다

문제 풀이

처음에는 x에서 시작해서 세 가지 연산을 재귀적으로 다 시도해보고 y에 도달하는 경로 중 가장 짧은 걸 고르면 되겠다고 생각했다.

하지만 y가 최대 1,000,000이고 매 단계마다 선택지가 3개씩 늘어나기 때문에, 모든 경로를 다 확인하면 경우의 수가 너무 커진다.

게다가 재귀로 아무 순서나 먼저 도달한 경로가 최소 횟수라는 보장도 없다.

이 문제의 핵심은 최소 횟수를 구하는 문제이므로, 값이 아니라 연산 횟수를 기준으로 한 칸씩 넓혀가는 BFS를 쓰면 y에 처음 도달하는 순간이 곧 최소 횟수라는 점이다.

  • 큐에는 (현재 값, 지금까지 쓴 연산 횟수)를 같이 넣는다
  • 세 연산으로 만들 수 있는 다음 값 중 y를 넘어서는 값은 애초에 버려서 탐색 범위를 y 이하로 제한한다
  • visited 배열로 이미 방문한 값은 다시 큐에 넣지 않아 중복 탐색을 막는다
  • 큐에서 꺼낸 값이 y와 같으면 그 자리에서 바로 count를 반환한다

큐가 다 빌 때까지 y에 도달하지 못하면 만들 수 없는 경우이므로 -1을 반환한다.

최종 코드

java
import java.util.*;

class Solution {
    public int solution(int x, int y, int n) {
        Deque<int[]> q = new ArrayDeque<>();
        boolean[] visited = new boolean[y + 1];

        q.add(new int[]{x, 0});
        visited[x] = true;

        while (!q.isEmpty()) {
            int[] now = q.poll();

            int value = now[0];
            int count = now[1];

            if (value == y) {
                return count; // BFS이므로 처음 도달하는 순간이 최소 횟수
            }

            int[] next = {
                value + n,
                value * 2,
                value * 3
            };

            for (int nextValue : next) {
                if (nextValue > y) {
                    continue; // y를 넘어서면 탐색할 필요가 없다
                }
                if (visited[nextValue]) {
                    continue; // 이미 방문한 값은 다시 큐에 넣지 않는다
                }

                visited[nextValue] = true;
                q.add(new int[]{nextValue, count + 1});
            }
        }

        return -1;
    }
}

함께 읽으면 좋은 글

코딩 테스트2026-08-23

택배상자

order 배열은 택배 기사님이 원하는 상자 적재 순서다 기존 컨테이너 벨트는 1번부터 순서대로만 꺼낼 수 있다 보조 벨트는 스택처럼 마지막에 넣은 것부터 꺼낼 수 있다 원하는 순서대로 최대한 실을 수 있는 상자 개수를 구하는 문제다 처음에는 기존 벨트를 실제 리스트로 만들어…

코딩 테스트2026-08-23

롤케이크 자르기

topping 배열은 롤케이크에 일렬로 올라간 토핑 번호다 한 지점을 잘라 두 조각으로 나눴을 때, 양쪽 토핑 종류 수가 같아야 공평하게 나눈 것이다 공평하게 자를 수 있는 방법의 수를 구하는 문제다 처음에는 자르는 위치마다 왼쪽과 오른쪽 배열을 나눠서 각각 서로 다른 토핑…

코딩 테스트2026-08-23

할인 행사

want, number 배열로 정현이가 원하는 제품과 수량을 표현한다 discount 배열은 XYZ 마트가 매일 할인하는 제품 목록이다 연속된 10일 동안 할인 제품 종류와 수량이 want, number와 정확히 일치해야 회원가입할 수 있다 그런 시작일이 총 몇 번 있는지…

코딩 테스트2026-08-23

두 원 사이의 정수 쌍

원점이 중심인 두 원이 있고 반지름은 각각 r1, r2다 (r1 < r2) 두 원 사이 공간에서 x, y 좌표가 모두 정수인 점의 개수를 구하는 문제다 원 위의 점도 포함해서 센다 처음에는 x, y 좌표를 이중 for문으로 전부 돌면서 각 점이 두 원 사이에 있는지 판별하면…