연속된 숫자 만들기 2

JunHyeok Seo·2025년 4월 7일

algorithm

목록 보기
20/30

문제

세 사람이 일직선 위에 서있다.
세 사람이 서있는 위치가 주어지면 양 끝에 있는 사람 중 한 사람을 택해 남은 두 사람 사이로 이동시켜 결국 세 사람의 위치가 연속될 수 있도록 한다.

코드 1

import java.util.Arrays;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] arr = new int[3];
		for (int i = 0; i < 3; i++) {
			arr[i] = sc.nextInt();
		}

		int cnt = 0;
		Arrays.sort(arr);
		while (arr[0] - arr[1] != -1 || arr[1] - arr[2] != -1) {
			int ab = Math.abs(arr[0] - arr[1]);
			int bc = Math.abs(arr[1] - arr[2]);

			if ((ab <= bc && ab != 1) || (ab != 1 && bc == 1)) {
				arr[2] = ab == 2 ? arr[0] + 1 : arr[0] + 2;
			} else if (bc != 1) {
				arr[0] = bc == 2 ? arr[1] + 1 : arr[1] + 2;
			}

			Arrays.sort(arr);
			cnt++;
		}

		System.out.println(cnt);
	}
}
  • while 루프를 이용해 조건이 만족될 때까지 반복
  • 각 단계마다 작은 쪽 또는 큰 쪽을 한 칸씩 움직이도록 구현
  • 문제를 "점진적으로 해결"하는 방식 선택

코드 2

import java.util.Scanner;
import java.util.Arrays;

public class Main {
    public static final int MAX_N = 3;

    public static int n = MAX_N;
    public static int[] a = new int[MAX_N];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 입력
        for(int i = 0; i < n; i++)
            a[i] = sc.nextInt();

        // 주어진 값들을 정렬합니다.
        Arrays.sort(a);

        // Case 1. 3개의 숫자가 전부 연속한 경우
        // 이 경우에는 이동할 필요가 없으므로
        // 최소 이동 횟수는 0이 됩니다.
        if(a[0] + 1 == a[1] && a[1] + 1 == a[2])
            System.out.print(0);
        // Case 2. 2개의 숫자의 차이가 정확히 2가 나는 경우
        // 이 경우에는 남은 숫자를 두 숫자 사이에 바로 넣어주면 되므로
        // 최소 이동 횟수는 1이 됩니다.
        else if(a[0] + 2 == a[1] || a[1] + 2 == a[2])
            System.out.print(1);
        // Case 3. 그렇지 않은 경우에는 항상 2번에 걸쳐
        // 3개의 숫자를 연속하게 만드는 것이 가능합니다.
        else
            System.out.print(2);
    }
}
  • 입력값을 정렬한 뒤, 세 가지 경우의 수로 분기
  • 이미 연속된 숫자인 경우 → 이동 횟수 0
  • 두 수가 2 차이 나는 경우 → 이동 횟수 1
  • 그 외의 모든 경우 → 이동 횟수 2 (항상 가능함)

0개의 댓글