쌓고 쌓다

[백준] 진법 변환2 11005번 C++ 풀이 본문

알고리즘/백준

[백준] 진법 변환2 11005번 C++ 풀이

승민아 2022. 5. 6. 19:36

전체 코드

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 777
typedef struct {
	int* s;
	int top;
} Stack;
void init(Stack* st)
{
	st->top = -1;
	st->s = (int*)malloc(sizeof(int) * MAX_SIZE);
}
bool is_empty(Stack* st)
{
	if (st->top == -1)
		return true;
	return false;
}
void push_back(Stack* st, int num)
{
	st->s[++(st->top)] = num;
}
int pop(Stack* st)
{
	return st->s[(st->top)--];
}
void solve(int num, int conv, Stack* stack)
{

	while (num > 0) {
		if (num % conv < 10)
			push_back(stack, num % conv);
		else
			push_back(stack, num % conv - 10 + 'A');
		num /= conv;
	}

	while (!is_empty(stack))
	{
		int res = pop(stack);
		if (res < 10)
			printf("%d", res);
		else
			printf("%c", res);
	}
	printf("\n");


}

int main(void)
{
	int num = 0;
	Stack stack;
	init(&stack);
	scanf("%d", &num);
	int conv;
	scanf("%d", &conv);
	solve(num, conv, &stack);

}

 

과제를 재활용해서 사용하는 거라... C언어로 스택을 구현하여 풀었습니다.

10진법을 N진법으로 바꿀때

1.현재 num을 N으로 나눈 나머지를 스택에 넣어줍니다.

2. 그리고 num을 N으로 나눕니다.

1,2를 num이 0이 될 때까지 합니다.

 

스택을 하나씩 뽑아내며 출력해주면 끝

 

		if (num % conv < 10)
			push_back(stack, num % conv);
		else
			push_back(stack, num % conv - 10 + 'A');

나눈 나머지가 10이 넘어간다면 A,B,... 이겠죠

만약 나눈 나머지가 10이라면 A가 스택에 들어가야 합니다.

그렇기에 현재 10에서 10을 빼주고 'A'를 더해준다면

10~15까지 순서대로 각각 A,B,..에 해당하는 수를 넣어집니다.

 

		if (res < 10)
			printf("%d", res);
		else
			printf("%c", res);

출력할 때 10보다 작다면 0~9일 테니 그냥 출력을 해주고

10보다 크다면 char형으로 변환하여 출력을 해주면 자연히 문자가 출력이 됩니다.

Comments