1. 문제 해결 전략
해결법이 안떠올랐다. 나눗셈 연산과 나머지 연산이 필요한 것과 아스키코드 변환이 필요할 것이라는 생각은 했지만 구현에 있어서 부족함을 많이 느낀 문제였다. 해당 코드는 다른 블로그에 있는 코드를 참조했다.
출처 : https://sihyungyou.github.io/baekjoon-11005/
#include <cstdio>
#include <stack>
using namespace std;
int main () {
int N, B;
stack <int> s;
scanf("%d %d", &N, &B);
while(1) {
if (N == 0) break;
s.push(N%B);
N /= B;
}
while(!s.empty()) {
s.top() < 10 ? printf("%d", s.top()) : printf("%c", s.top() + 55);
s.pop();
}
printf("\n");
return 0;
}
일단 비슷한 유형이 많을 것 같아서 짚고 넘어가야 할 것 같아서 자세히 다루어 보겠다.
이 문제는 십진법의 수를 1~26진법까지 변환을 하는 문제이고, 10진법을 넘어갔을 때 각자리의 표기법은
대문자 'A' ~ 'Z'까지로 대체한다.
핵심은 while문이다. GCD에서부터 이 문제까지 계속해서 나머지/ 나눗셈 연산을 필요로 하고 있다.
가장 간단하게 2진법을 생각해보자. 7이라는 숫자가 들어왔고 이 수를 2진법으로 바꾸려면 어떻게 해야 할까?
7을 2진법으로 나타내면 111이다. 각 자리들은 7을 2로 몇번 나눠졌는지로 정해지며, 각 자리수는 2로 나눈 나머지 값이 들어가게 된다. 7을 N번 나누어 값이 0이 되었을 때까지 반복하게 된다.
7/2 = 3 , 7%2 =1
3/2 = 1, 3%2 = 1
1/2 = 0, 1%2 =1
하나의 예를 더 들어서 129를 12진법으로 바꾸어보자.
129/12 = 10 , 129%12 = 9
10/12 = 0 , 10 % 12 = 10
따라서 A9(16)이 된다.
이제 이렇게 바꾸어진 각 자리수들을 어떻게 저장한 후 출력하는지에 대해 생각을 해야하는데
위의 12진법에서도 봤듯이 10이상의 숫자들은 알파벳으로 대체된다.
코드를 보면 되게 간단하게 풀이가 되어있는데, stack에 자리수가 작은 수들부터 집어넣은후
출력할 때는 큰 자릿수 부터 꺼내서 10이상인지 아닌지를 체크하여 해결을 한다.
2. 걸린 시간
실패
3. 느낀점
기본적인 문제도 못푼 자신이 한심해졌다.
가끔 이렇게 못푼 문제를 구글에 올라온 풀이를 보며 이해하려 할 때, 그 코드가 무지하게 짧으면 더 허탈한 것 같다 ㅋㅋ. 진법문제는 처음 풀어봤는데 다음엔 맞출수 있겠지..
4. 링크
https://www.acmicpc.net/problem/11005
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
[진법] 11576. Base Conversion (0) | 2020.05.05 |
---|---|
[진법] 1373. 2진수 8진수 (0) | 2020.05.05 |
[리스트] 1168. 요세푸스 문제 2 (0) | 2020.05.01 |
[링크드리스트] 1158. 요세푸스 문제 (0) | 2020.04.30 |
[리스트] 1406. 에디터 (0) | 2020.04.30 |