정수 Num이 입력으로 주어졌을 때, 스택(Stack) 자료구조를 활용해 그 숫자를 뒤집은 값을 구하는 것이 이 글의 목표입니다.
스택(Stack)이란?
스택은 C++에서 데이터를 LIFO(Last In First Out, 후입선출) 방식으로 저장하는 자료구조입니다. 가장 나중에 넣은 데이터가 가장 먼저 나오는 구조이며, 주요 연산은 다음과 같습니다.
선언 방법: stack<int> stck; // stck가 스택 변수가 됩니다.
top() – 최상단 요소 확인: stck.top()은 스택의 가장 위에 있는 요소에 대한 참조를 반환합니다.
pop() – 최상단 요소 제거: 스택의 맨 위에 있는 요소를 제거합니다.
push() – 요소 추가: stck.push(value)는 값 value를 스택에 삽입합니다. value의 타입은 스택에 지정된 타입과 일치해야 합니다.
empty() – 빈 스택 확인: stck.empty()는 스택이 비어 있으면 true를 반환합니다.
예제
예제 1
입력 − Num = 33267
출력 − 숫자의 역순: 76233
설명 −
먼저 모든 자릿수를 스택에 push합니다.
7 - 6 - 2 - 3 - 3 ← top
꺼낸 자릿수에 자리값을 곱해 모두 더하면:
7 * 10000 + 6 * 1000 + 2 * 100 + 3 * 10 + 3 * 1 = 70000 + 6000 + 200 + 30 + 3 = 76233
예제 2
입력 − Num = 111000
출력 − 숫자의 역순: 111
설명 −
먼저 모든 자릿수를 스택에 push합니다.
0 - 0 - 0 - 1 - 1 - 1 ← top
0 * 100000 + 0 * 10000 + 0 * 1000 + 1 * 100 + 1 * 10 + 1 * 1 = 0 + 0 + 0 + 100 + 10 + 1 = 111
알고리즘 접근 방식
이 접근법에서는 입력 숫자를 10으로 나눈 나머지(일의 자릿수)를 스택에 push하고, 숫자를 10으로 나누며 0이 될 때까지 반복합니다. 이렇게 하면 스택의 top에 가장 높은 자릿수가 위치하게 되어, pop 순서대로 꺼내면 자연스럽게 뒤집힌 숫자가 완성됩니다.
단계별 과정
- 입력 숫자 Num을 받습니다.
stack<int> stck;로 정수형 빈 스택을 선언합니다.- 함수 pushDigts(int num1)는 num1을 받아 최상위 자릿수가 top에 오도록 스택을 채웁니다.
- 나머지를 저장할 변수 rem을 준비합니다.
- while 루프로 num1이 0이 아닌 동안 rem = num1 % 10을 계산합니다.
- rem을 스택에 push합니다.
- num1을 10으로 나누어 다음 자릿수를 처리합니다.
- revrseNum() 함수에서 스택의 요소들을 꺼내 역순 숫자를 조립합니다.
- 변수 revrs, topp, temp, i를 준비합니다.
- 스택이 비어 있지 않은 동안 반복합니다.
- topp = stck.top()으로 최상단 요소를 가져옵니다.
- stck.pop()으로 스택에서 요소를 제거합니다.
- temp = topp * i로 자리값을 곱합니다.
- temp를 revrs에 더합니다.
- i를 10배씩 증가시켜 다음 자릿수의 자리값을 만듭니다.
- 반복이 끝나면 입력 숫자의 역순 revrs를 반환합니다.
- main 함수에서 결과를 출력합니다.
구현 예시 (C++)
#include <bits/stdc++.h>
using namespace std;
stack <int> stck;
void pushDigts(int num1){
int rem;
while (num1 > 0){
rem=num1 % 10;
stck.push(rem);
num1 = num1 / 10;
}
}
int revrseNum(){
int revrs = 0;
int i = 1;
int temp;
int topp;
while (!stck.empty()){
topp=stck.top();
stck.pop();
temp=topp*i;
revrs = revrs + temp;
i *= 10;
}
return revrs;
}
int main(){
int Num = 43556;
pushDigts(Num);
cout<<"Reverse of number is: "<<revrseNum();
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
Reverse of number is: 65534