나는 진법을 변환할 때 일일히 나머지를 string으로 변환해서 붙이고, 그 중 10~15는 A~F로 변환하였다.
그런데, 다른 분의 풀이를 보니 배열에 string형태로 '0'~'9', 'A'~'F' 전부 포함해두고 그 배열을 활용하면 훨씬 코드가 단순할 수 있다는 걸 알았다.
#include <string>
#include <vector>
using namespace std;
string formation(int n, int num)
{
if (num == 0) return "0"; // 예외 처리
string str="";
while(num != 0)
{
int sub = num % n;
if(sub >= 10 && sub <= 15)
{
str = char('A' + (sub - 10)) + str;
}
else
str = to_string(sub) + str;
num /= n;
}
return str;
}
string solution(int n, int t, int m, int p) {
string answer = "";
// 0부터 커지다가 n이 되는 순간 10으로 변함
// 16진수는 10~15가 A, B, ... 이고 16이 되면 10으로 변함 ex.26 = 10+16-> 1A
// m개씩 나눠서 배열에 저장, 모든 배열의 p번째만 구하면 됨
// 모든 수는 str로 바꾼 뒤 한 자리씩 나눠서 배열에 넣어야 함
int num = 0; // 현재 숫자
string seq = "";
// 필요한 길이(t * m)만큼 숫자를 변환해서 문자열에 저장
while (seq.length() < t * m) {
seq += formation(n, num);
num++;
}
for (int i = 0; i < t; i++) {
answer += seq[p - 1 + i * m]; // p번째는 p-1 인덱스
}
return answer;
}
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
char number[18] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'};
string number_to_n(int num, int n){
string result;
if(num == 0){
return "0";
}
while(num > 0){
result += number[num % n];
num /= n;
}
reverse(result.begin(), result.end());
return result;
}
string solution(int n, int t, int m, int p) {
string answer = "";
string temp;
int mt = m * t;
for(int num = 0; temp.size() <= mt; num++){
string ngame = number_to_n(num, n);
temp += ngame;
}
for(int i = 0; i < t; i++){
answer += temp.at((m*i)+(p-1));
}
return answer;
}
그리고, 처음엔 이중벡터를 활용해서 진법변환한 string을 하나씩 분해해서 이중벡터에 넣은 다음 그 벡터를 돌면서 p번째를 꺼냈는데
(n: 진법, t: 꺼낼 숫자 갯수, m: 참가자 수, p: 주인공의 번호)
그냥 전부 string으로 저장한 다음, m명씩 끊어서 총 t번을 주인공이 해당하는 숫자만 가져오면 되는 거였다.
벡터로 생각했던 논리랑 같았는데, 복잡하게 공간을 많이 쓸 필요가 없다는 것!!