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

스택(Stack)을 활용해 문자열을 뒤집는 Java 프로그램 완벽 가이드

이 글에서는 스택(Stack) 자료구조를 활용하여 문자열을 뒤집는 방법을 단계별로 살펴봅니다.

문자열(String)은 하나 이상의 문자를 포함하고 큰따옴표(" ")로 감싸진 데이터 타입입니다. 스택은 객체들의 집합을 저장하는 선형 자료구조로, LIFO(Last-In-First-Out, 후입선출) 방식을 기반으로 동작합니다. 즉, 가장 나중에 넣은 요소가 가장 먼저 나오는 구조이기 때문에 문자열을 역순으로 만들 때 매우 유용하게 활용됩니다.

실제 동작 결과는 다음과 같습니다.

입력값

Input string: Java Program

기대 출력값

Reversed string: margorP avaJ

동작 원리 및 알고리즘

스택으로 문자열을 뒤집는 핵심 아이디어는 간단합니다. 문자열의 문자를 순서대로 스택에 모두 넣은(push) 후, 다시 하나씩 꺼내면(pop) LIFO 특성에 의해 자연스럽게 역순의 문자열이 만들어집니다.

Step 1 - START
Step 2 - 두 개의 문자열(input_string, result), 하나의 스택(stack), 그리고 char 배열(reverse)을 선언한다.
Step 3 - 입력 문자열 값을 정의한다.
Step 4 - for 루프로 문자열의 각 문자를 순회하며 push 메서드로 스택에 삽입한다.
Step 5 - pop 메서드로 스택의 요소를 하나씩 꺼내 result 문자열에 저장한다.
Step 6 - 결과를 출력한다.
Step 7 - STOP

예제 1: main 메서드에서 전체 로직 구현하기

첫 번째 방법은 모든 연산을 main 메서드 안에 직접 작성하는 방식입니다. 코드 흐름을 한눈에 파악하기 좋아 학습용으로 적합합니다.

import java.util.*;
public class ReverseString {
   public static void main(String[] args) {
      System.out.println("Required packages have been imported");
      String input_string = "Java Program";
      System.out.println("The string is defined as " +input_string);
      char[] reverse = new char[input_string.length()];
      Stack<Character> stack = new Stack<Character>();
      for (int i = 0; i < input_string.length(); i++) {
         stack.push(input_string.charAt(i));
      }
      int i = 0;
      while (!stack.isEmpty()) {
         reverse[i++] = stack.pop();
      }
      String result = new String(reverse);
      System.out.println("
The reversed string is: " + result);
   }
}

실행 결과

Required packages have been imported
The string is defined as Java Program

The reversed string is: margorP avaJ

예제 2: 객체 지향 방식으로 함수 분리하기

두 번째 방법은 문자열 뒤집기 로직을 별도의 메서드로 캡슐화하는 객체 지향 프로그래밍(OOP) 스타일입니다. 재사용성이 높아 실무 코드에서 더 권장되는 구조입니다.

import java.util.*;
public class ReverseString {
   public static String reverse_string(String input_string) {
      char[] reverse = new char[input_string.length()];
      Stack<Character> stack = new Stack<Character>();
      for (int i = 0; i < input_string.length(); i++) {
         stack.push(input_string.charAt(i));
      }
      int i = 0;
      while (!stack.isEmpty()) {
         reverse[i++] = stack.pop();
      }
      return new String(reverse);
   }
   public static void main(String[] args) {
      System.out.println("Required packages have been imported");
      String input_string = "Java Program";
      System.out.println("The string is defined as " +input_string);
      System.out.println("
The reversed string is: " + reverse_string(input_string));
   }
}

실행 결과

Required packages have been imported
The string is defined as Java Program

The reversed string is: margorP avaJ

마무리

두 예제 모두 동일한 결과를 출력하지만, 예제 2처럼 기능을 메서드로 분리하면 코드의 가독성과 재사용성이 크게 향상됩니다. 스택의 LIFO 특성만 이해하면 문자열 뒤집기 외에도 괄호 검사, 실행 취소(Undo) 기능 등 다양한 문제에 응용할 수 있으니 꼭 기억해 두시기 바랍니다.