[알고리즘] 문제풀이 연습

[알골90제] 53번 - K진수 출력 : 스택 자료구조

ddgoori 2019. 7. 30. 15:50

* 문제

 

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() : 스택 사이즈를 반환