BOJ 11005 (진법 변환 2)

JH·2023년 6월 19일
0

BOJ 알고리즘 (C++)

목록 보기
68/97
  • 문제
    10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

    10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

    A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

  • 입력
    첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

  • 출력
    첫째 줄에 10진법 수 N을 B진법으로 출력한다.

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N, B;
vector<char> answer;
void fast_io()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
}

int main()
{
	fast_io();
	cin >> N >> B;
	while (N != 0)
	{
		int num = N % B;
		if (num > 9)
		{
			answer.push_back(num + 55);
		}
		else {
			answer.push_back(num + '0');
		}
		N = N / B;
	}
	for (int i = answer.size() - 1; i >= 0; i--)
	{
		cout << answer[i];
	}

	return 0;
}

   2진법을 구할 때 처럼 B진법으로 계속 나눠주며 몫과 나머지를 기록하고 최종 몫이 1이 될때 몫부터 거꾸로 읽어주면 된다.
10 이상부터는 A,B 와 같이 알파벳 대문자를 사용하므로 아스키 코드 값을 고려해 55, '0'을 더해주면 된다.

시간 복잡도 : O(N)


숏코딩1 (풀이 방식은 같음)

#include<iostream>
using namespace std;

char s[32];

int main(){

	int r,n,i=31;
	cin >> n >> r;
	while(n){
		char c = n%r;
		s[--i]=c+(c<10 ? '0' : 'A'-10);
		n /= r;
	}
	cout << s+i;

    return 0;
}

숏코딩 2 (배열의 index로 숫자 표현? + 재귀함수 사용 -> O(1)이라 재귀가 가능한 듯 싶다

#include<cstdio>
int i, N, B;
char m[36];
void seq(int n)
{
	if(n/B)
		seq(n/B);
	printf("%c",m[n%B]);
}
int main()
{
	for(;i<10;i++)
		m[i]=48+i;
	for(;i<36;i++)
		m[i]=55+i;
	scanf("%d%d",&N,&B);
	seq(N);
}
profile
블로그 -> 노션

0개의 댓글