문제
- 1036번 - 36진수
- Rank : Gold I
- 링크 : https://www.acmicpc.net/problem/1036
풀이 전략
- 36진수를 저장할 수 있는 구조체를 생성한 후, 해당 구조체를 사용하는 덧셈 함수를 만든다
- 각 36진수를 입력받을때, sum 이외의 각 자리수가 Z로 바뀌었을때 더해지는 값을 저장할 배열을 생성하여 관리한다.
EX : 36진수 'Z120'
struct sum, digitsum[36]
sum += 'Z120'
Z = (Z-Z) * 36^3 -> digitsum[Z->35]에 더함
1 = (Z-1) * 36^2 -> digitsum[1]에 더함
2 = (Z-2) * 36 -> digitsum[2]에 더함
0 = (Z-0) * 1 -> digitsum[0]에 더함
- 모든 단어를 입력받은 후, 배열을 크기순으로 정렬하여 N개의 36진수를 SUM값에 더한다.
전체 소스 코드
더보기
//Backjoon Problem No.1036
//https://www.acmicpc.net/problem/1036
#include <iostream>
#include <string>
#include <queue>
using namespace std;
struct decimal36
{
unsigned int cipher[60] = { 0, };
int maxDigit = 0;
bool operator<(const decimal36& t) const
{
if (maxDigit != t.maxDigit)
return maxDigit < t.maxDigit;
for (int i = maxDigit; i >= 0; i--)
{
if (cipher[i] != t.cipher[i])
return cipher[i] < t.cipher[i];
}
return false;
}
};
priority_queue<decimal36> decQueue;
decimal36 byCipher[36];
decimal36 total;
void arrangeCipher(decimal36 &de)
{
for (int i = 0; i < 60; i++)
{
if (de.cipher[i] > 0)
{
de.maxDigit = i;
if (de.cipher[i] > 35) //
{
de.cipher[i+1] += (int)(de.cipher[i] / 36);
de.cipher[i] = de.cipher[i] % 36;
}
}
}
}
int charTode36(char c)
{
int a = (int)c;
if (a < 60) //0 = 48, 9 = 57;
return a - 48;
else //A = 65; Z = 90;
return a - 55;
}
char cipherTochar(int i)
{
if (i < 10)
return (char)(i + 48);
else
return (char)(i + 55);
}
int N, K;
int main()
{
//입출력 속도 증가
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++)
{
string temp;
cin >> temp;
if (temp.size() == 1 && temp.at(0) == '0')
continue;
for (int j = 0; j < temp.size(); j++)
{
int target = charTode36(temp.at(j));
byCipher[target].cipher[temp.size() - j - 1] += 35 - target;
total.cipher[temp.size() - j - 1] += target;
}
}
for (int i = 0; i < 36; i++)
{
arrangeCipher(byCipher[i]);
decQueue.push(byCipher[i]);
}
cin >> K;
for (int i = 0; i < K; i++)
{
decimal36 temp = decQueue.top();
for (int j = 0; j < 60; j++)
{
total.cipher[j] = temp.cipher[j] + total.cipher[j];
}
decQueue.pop();
}
arrangeCipher(total);
for (int i = total.maxDigit; i >= 0; i--)
{
cout << cipherTochar(total.cipher[i]);
}
return 0;
Note
'Problem Solving > Backjoon' 카테고리의 다른 글
[백준][C++]2467 - 용액 (0) | 2022.04.06 |
---|---|
[백준][C++]9465 - 스티커 (0) | 2022.03.14 |
[백준][C++]1562 - 계단 수 (0) | 2022.03.08 |
[백준][C++]1043 - 거짓말 (0) | 2022.03.03 |
[백준][C++]9663 - N-Queen (0) | 2022.03.02 |