Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)로 숫자 나선형 패턴 출력하기: 알고리즘과 코드 예제

들어가며

이 글에서는 자바(Java)를 이용해 숫자의 나선형(spiral) 패턴을 콘솔에 출력하는 방법을 알아봅니다. 이 패턴은 여러 개의 for 반복문과 print 문을 조합해 만들 수 있으며, 중앙의 1을 기준으로 바깥으로 갈수록 숫자가 하나씩 커지는 동심원 형태의 사각형 구조가 특징입니다.

실행 결과 미리 보기

입력

사용자가 크기로 5를 입력했다고 가정해 보겠습니다.

크기를 입력하세요 : 5

출력

그러면 다음과 같은 나선형 패턴이 화면에 출력됩니다.

나선형 패턴
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5

알고리즘

1단계 - 시작
2단계 - 정수형 변수 i, j, my_input, my_pattern_size를 선언한다
3단계 - 사용자로부터 필요한 값을 입력받거나 값을 직접 정의한다
4단계 - my_pattern_size에 2 * my_input - 1 값을 할당한다
5단계 - 두 개의 중첩된 for 반복문을 사용해 행과 열을 순회한다
6단계 - 각 위치마다 Math.max(Math.abs(i - my_input), Math.abs(j - my_input)) + 1 값을 계산하여 출력한다
7단계 - 결과를 화면에 표시한다
8단계 - 종료

패턴 생성 원리

이 패턴의 핵심은 다음 한 줄의 수식입니다.

Math.max(Math.abs(i - my_input), Math.abs(j - my_input)) + 1

|i - my_input|는 현재 행이 중앙 행에서 떨어진 거리를, |j - my_input|는 현재 열이 중앙 열에서 떨어진 거리를 의미합니다. 이 둘 중 더 큰 값을 선택하면 해당 칸이 속한 '링(ring)' 번호가 계산되고, 여기에 1을 더하면 최종 숫자가 됩니다. 그 결과 중앙은 1, 그 주변은 2, 다시 그 바깥은 3처럼 층층이 쌓인 나선형 패턴이 완성됩니다.

예제 1: 사용자 입력으로 패턴 출력하기

아래 예제에서는 Scanner 클래스를 사용해 사용자가 직접 크기를 입력하면, 그 값에 맞는 나선형 패턴을 출력합니다.

import java.util.Scanner;
import java.lang.Math;
public class SpiralPattern{
   public static void main(String args[]){
      int my_input , i, j, my_pattern_size;
      System.out.println("필요한 패키지를 모두 가져왔습니다.");
      Scanner my_scanner = new Scanner(System.in);
      System.out.println("Scanner 객체가 생성되었습니다.");
      System.out.print("크기를 입력하세요 : ");
      my_input = my_scanner.nextInt();
      System.out.print("나선형 패턴");
      System.out.println();
      my_pattern_size = 2 * my_input - 1;
      for( i = 1; i <= my_pattern_size; i++){
         for( j = 1; j <= my_pattern_size; j++){
            System.out.print(Math.max(Math.abs(i - my_input), Math.abs(j - my_input)) + 1 + " ");
         }
         System.out.println();
      }
   }
}

출력 결과

필요한 패키지를 모두 가져왔습니다.
Scanner 객체가 생성되었습니다.
크기를 입력하세요 : 5
나선형 패턴
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5

예제 2: 미리 정의된 값으로 패턴 출력하기

이번에는 사용자 입력 없이 정수값을 코드 안에서 미리 정의하고, 그 값을 이용해 패턴을 출력합니다. 입력 과정 없이 빠르게 결과를 확인해야 할 때 유용한 방식입니다.

import java.lang.Math;
public class SpiralPattern{
   public static void main(String args[]){
      int my_input , i, j, my_pattern_size;
      System.out.println("필요한 패키지를 모두 가져왔습니다.");
      my_input = 5;
      System.out.println("크기가 " + my_input + "(으)로 정의되었습니다.");
      System.out.print("나선형 패턴");
      System.out.println();
      my_pattern_size = 2 * my_input - 1;
      for( i = 1; i <= my_pattern_size; i++){
         for( j = 1; j <= my_pattern_size; j++){
            System.out.print(Math.max(Math.abs(i - my_input), Math.abs(j - my_input)) + 1 + " ");
         }
         System.out.println();
      }
   }
}

출력 결과

필요한 패키지를 모두 가져왔습니다.
크기가 5(으)로 정의되었습니다.
나선형 패턴
5 5 5 5 5 5 5 5 5
5 4 4 4 4 4 4 4 5
5 4 3 3 3 3 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 2 1 2 3 4 5
5 4 3 2 2 2 3 4 5
5 4 3 3 3 3 3 4 5
5 4 4 4 4 4 4 4 5
5 5 5 5 5 5 5 5 5

마무리

이처럼 자바에서는 중첩 반복문과 Math.max(), Math.abs() 메서드만으로도 복잡한 로직 없이 규칙적인 나선형 숫자 패턴을 손쉽게 출력할 수 있습니다. 입력 크기만 바꾸면 원하는 크기의 패턴을 자유롭게 만들 수 있으니, 다양한 값으로 직접 실험해 보시기 바랍니다.