* 문제
10진수 N이 입력되면 K진수로 변환하여 출력하는 프로그램을 작성하세요. 스택 자료구조 이용하기
- 입력: 10진수와 몇진수로 할지 (2, 5, 8, 16) 중 택 1
11 2
- 출력:
1011
- 입력:
31 16
- 출력:
1F
* 생각
- 스택을 굳이 이용하는 이유는?
- 10진수를 다른 진수로 바꾸는 식은?
*풀이(스택)
1) 스택이라는 일차원 배열을 만듬
2) top = -1로 초기화
3) push(2);
- top은 항상 ++먼저 증가하고 대입하기 때문에 맨 위에 있는 자료를 가리킨다.
*K진수 출력 풀이(스택이용)
- 입력 11 2 이면 11을 2로 나눈 나머지를 스택에 push한다.
- 나눈 몫에서 다시 2로 나눠서 나머지값을 push
- 나눈 몫에서 다시 2로 나눠서 나머지 값을 push
- 2로 나눈 나머지 push반복
- 몫이 0이 되면 끝
- 자료가 들은 스택에서 0부터 top까지 출력
*코드 구현(스택)
//53번 - K진수 출력 (스택이용)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int stack[100], top = -1;
void push(int x) {
stack[++top] = x;
}
int pop() {
return stack[top--];
}
int main() {
int n, k;
//16진수를 위해, 15면 str의15인 F가 찍히는 것이다.
char str[20] = "0123423789ABCDEF";
scanf("%d %d", &n, &k);
while (n>0) {
push(n % k);
n = n / k;
}
//pop해서 top이 -1될 때까지 즉, 스택에 있는 자료를 모두 꺼낼 때까지 반복
while (top != -1) {
//str은 char배열이기 때문에 c로 찍어줘야 함
printf("%c", str[pop()]);
}
return 0;
}
*코드 구현(스택) - STL사용
////53번 - K진수 출력 (스택이용) - STL사용
//
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <stack> //stck STL 사용
using namespace std;
int main() {
int n, k;
stack<int> s; //스택 자료구조 만듬
//16진수를 위해, 15면 str의15인 F가 찍히는 것이다.
char str[20] = "0123456789ABCDEF";
scanf("%d %d", &n, &k);
while (n > 0) {
s.push(n % k);
n = n / k;
}
//s.empty: 스택이 비어있으면 참(1)반환 꽉차있음(0)
while (!s.empty()) {
//str은 char배열이기 때문에 c로 찍어줘야 함
//s.top는 맨위의 자료를 참조만 해주는 것
printf("%c", str[s.top()]);
s.pop();//꺼내는 것
}
return 0;
}
* STL : STACK
추가 및 삭제
- push(element) : top에 원소를 추가
- pop() : top에 있는 원소를 삭제
조회
- top() : top(스택의 처음이 아닌 가장 끝)에 있는 원소를 반환
기타
- empty() : 스택이 비어있으면 true 아니면 false를 반환
- size() : 스택 사이즈를 반환
'[알고리즘] 문제풀이 연습' 카테고리의 다른 글
[알골90제] 55번 - 기차운행 : STACK 응용 (0) | 2019.07.31 |
---|---|
[알골90제] 54번 - 올바른 괄호 : STACK 이용 (0) | 2019.07.30 |
[알골90제] 52번 - Ugly Numbers : 투포인트 알고리즘 응용 (0) | 2019.07.30 |
[알골90제] 50/51번 - 브루트포스/다이나믹프로그래밍 : 오렌지나무 territory 선택 (small/big) (0) | 2019.07.29 |
[알골90제] 49번 - 쌓기 블록의 최대값 (2차원 배열 응용) (0) | 2019.07.28 |