이 글에서는 스택(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) 기능 등 다양한 문제에 응용할 수 있으니 꼭 기억해 두시기 바랍니다.