A진법 수 N을 입력 받아 B진법 수로 출력하는 프로그램을 작성하시오.
N에 사용되는 값은 0 ~ 9, A ~ Z이다.
(2 <= A, B <= 36) ( 0<= N<= 263 -1 )
입력은 100개 이하의 테스트 케이스가 행으로 구분하여 주어진다.
테스트 케이스의 끝에는 0이 주어진다.
각 테스트 케이스에는 세 수 A, N, B가 공백으로 구분되어 주어진다.
각 테스트 케이스에 대하여 A진법수 N을 B진법 수로 변환한 결과를 행으로 구분하여 출력한다.
2 10110 10
10 2543 16
16 ABC 8
0 22
9EF
5274
먼저 10진수로 값을 변환한 이후 10진수에서 다른 진수로 변환하는 나누기방법을 사용하면 될 것 같습니다.
설명하자면 2진수인 1010의 10진수로의 변환은 오른쪽부터 가중치 1로 시작해서 원본 진수인 2를 가중치에 곱하면서 원본 값과 더하면 구할 수 있습니다.
위 예제는 1 * 8 + 0 * 4 + 1 * 2 + 0 * 1 = 10이 됩니다.
10진수에서 2진수로의 변환은 10진수 값을 변경하고 싶은 진수로 나누고 목을 밑에 적고 나머지를 오른쪽에 둡니다.
더 이상 나눠지지 않을 때 까지 나눈 뒤 해당 값에서부터 거꾸로 올라가면서 작성하면 2진수로의 변환이 됩니다.
위 예제에서 더 이상 나눠지지 않는 몫인 1부터 오른쪽 위로 1010이 됩니다.
그런데 생각했던 대로 한번에 결과가 나오지 않았습니다.
실행 결과 접기
접기 40점 코드 접기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include < iostream>
#include < string >
#include < stack >
#include < map>
using namespace std ;
map< char , int > charToDecimal;
map< int , char > decimalToChar;
void Initialize();
int ToDecimal(const string & val, int code);
string ToCodedNumber(int num, int code);
int main()
{
Initialize();
while (true )
{
string val;
int from, to;
// 입력 및 종료조건 설정
cin > > from;
if (from = = 0 ) break ;
cin > > val > > to;
// 입력된 숫자를 10진수로 변경
int num{ ToDecimal(val, from) };
string result{ ToCodedNumber(num, to) };
cout < < result < < endl ;
}
}
void Initialize()
{
// 진법 변환에 사용할 map을 채워준다.
char alpha{ 'A' };
for (int i = 10 ; i < = 36 ; + + i)
{
charToDecimal[alpha] = i;
decimalToChar[i] = alpha;
alpha+ + ;
}
}
int ToDecimal(const string & val, int code)
{
int result{ 0 };
int weight{ 1 };
for (auto c = val.rbegin(); c ! = val.rend(); + + c)
{
int num{ * c - '0' };
// 숫자인 경우
if (num > = 0 & & num < = 9 )
{
result + = num * weight;
}
// 문자인 경우
else
{
// 문자를 해당하는 숫자로 변환한 뒤 계산한다.
result + = charToDecimal[* c] * weight;
}
// 자리수 증가로 인한 가중치 증가
weight * = code;
}
return result;
}
string ToCodedNumber(int num, int code)
{
// 자리수를 맞추기 위한 스택
stack < char > tempStack;
while (num > 0 )
{
int rest{ num % code };
// 숫자로 사용할 수 있는 경우
if (rest > = 0 & & rest < = 9 )
{
tempStack.push(rest + '0' );
}
// 문자로 변환해야 하는 경우
else
{
tempStack.push(decimalToChar[rest]);
}
num / = code;
}
string result;
while (tempStack.size () > 0 )
{
result.push_back (tempStack.top());
tempStack.pop ();
}
return result;
}
cs
접기
일단 위 결과에서는 일반적인 계산처리는 문제가 없었습니다. 그런데 결과가 0인 경우 애초에 나눠지지 않기 때문에 값이 들어가지 않아서 결과가 달랐던 것 같습니다. 그러므로 모든 계산이 끝난 이후 result가 비어있다면 result에 0을 넣고 리턴하도록 하면 될 것 같습니다.
흠... 해당 부분만 문제라고 생각했는데 다른 문제가 있는 것 같습니다.
수정이후 실행결과 접기
접기 50점 코드 접기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include < iostream>
#include < string >
#include < stack >
#include < map>
using namespace std ;
map< char , int > charToDecimal;
map< int , char > decimalToChar;
void Initialize();
int ToDecimal(const string & val, int code);
string ToCodedNumber(int num, int code);
int main()
{
Initialize();
while (true )
{
string val;
int from, to;
// 입력 및 종료조건 설정
cin > > from;
if (from = = 0 ) break ;
cin > > val > > to;
// 입력된 숫자를 10진수로 변경
int num{ ToDecimal(val, from) };
string result{ ToCodedNumber(num, to) };
cout < < result < < endl ;
}
}
void Initialize()
{
// 진법 변환에 사용할 map을 채워준다.
char alpha{ 'A' };
for (int i = 10 ; i < = 36 ; + + i)
{
charToDecimal[alpha] = i;
decimalToChar[i] = alpha;
alpha+ + ;
}
}
int ToDecimal(const string & val, int code)
{
int result{ 0 };
int weight{ 1 };
for (auto c = val.rbegin(); c ! = val.rend(); + + c)
{
int num{ * c - '0' };
// 숫자인 경우
if (num > = 0 & & num < = 9 )
{
result + = num * weight;
}
// 문자인 경우
else
{
// 문자를 해당하는 숫자로 변환한 뒤 계산한다.
result + = charToDecimal[* c] * weight;
}
// 자리수 증가로 인한 가중치 증가
weight * = code;
}
return result;
}
string ToCodedNumber(int num, int code)
{
// 자리수를 맞추기 위한 스택
stack < char > tempStack;
while (num > 0 )
{
int rest{ num % code };
// 숫자로 사용할 수 있는 경우
if (rest > = 0 & & rest < = 9 )
{
tempStack.push(rest + '0' );
}
// 문자로 변환해야 하는 경우
else
{
tempStack.push(decimalToChar[rest]);
}
num / = code;
}
// 스택을 이용해 자리수를 맞춘다.
string result;
while (tempStack.size () > 0 )
{
result.push_back (tempStack.top());
tempStack.pop ();
}
// 결과가 0인경우 0을 결과로 넣어준다.
if (result.size () = = 0 )
{
result.push_back ('0' );
}
return result;
}
cs
접기
수정이후 0이되어서는 안되는 부분에서 0이되는 경우가 발생한 것을 확인할 수 있었습니다. 해당 값을 디버깅해서 문제를 확인해 보도록 하죠.
디버깅을 돌리다보니 값의 범위를 다시 확인하게 되는데요, 2^63-1 까지가 범위네요. 즉, long long형을 사용해야 하는 문제였습니다.
코드 접기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include < iostream>
#include < string >
#include < stack >
#include < map>
using namespace std ;
map< char , int > charToDecimal;
map< int , char > decimalToChar;
void Initialize();
long long ToDecimal(const string & val, int code);
string ToCodedNumber(long long num, int code);
int main()
{
Initialize();
while (true )
{
string val;
int from, to;
// 입력 및 종료조건 설정
cin > > from;
if (from = = 0 ) break ;
cin > > val > > to;
// 입력된 숫자를 10진수로 변경
long long num{ ToDecimal(val, from) };
string result{ ToCodedNumber(num, to) };
cout < < result < < endl ;
}
}
void Initialize()
{
// 진법 변환에 사용할 map을 채워준다.
char alpha{ 'A' };
for (int i = 10 ; i < = 36 ; + + i)
{
charToDecimal[alpha] = i;
decimalToChar[i] = alpha;
alpha+ + ;
}
}
long long ToDecimal(const string & val, int code)
{
long long result{ 0 };
long long weight{ 1 };
for (auto c = val.rbegin(); c ! = val.rend(); + + c)
{
int num{ * c - '0' };
// 숫자인 경우
if (num > = 0 & & num < = 9 )
{
result + = num * weight;
}
// 문자인 경우
else
{
// 문자를 해당하는 숫자로 변환한 뒤 계산한다.
result + = charToDecimal[* c] * weight;
}
// 자리수 증가로 인한 가중치 증가
weight * = code;
}
return result;
}
string ToCodedNumber(long long num, int code)
{
// 자리수를 맞추기 위한 스택
stack < char > tempStack;
while (num > 0 )
{
int rest{ num % code };
// 숫자로 사용할 수 있는 경우
if (rest > = 0 & & rest < = 9 )
{
tempStack.push(rest + '0' );
}
// 문자로 변환해야 하는 경우
else
{
tempStack.push(decimalToChar[rest]);
}
num / = code;
}
// 스택을 이용해 자리수를 맞춘다.
string result;
while (tempStack.size () > 0 )
{
result.push_back (tempStack.top());
tempStack.pop ();
}
// 결과가 0인경우 0을 결과로 넣어준다.
if (result.size () = = 0 )
{
result.push_back ('0' );
}
return result;
}
cs
접기
JUNGOL) 문제은행) 실력키우기) 진법 변환