진법 변환 함수

Subin·2025년 2월 25일

Algorithm

목록 보기
65/69

나는 진법을 변환할 때 일일히 나머지를 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번을 주인공이 해당하는 숫자만 가져오면 되는 거였다.

벡터로 생각했던 논리랑 같았는데, 복잡하게 공간을 많이 쓸 필요가 없다는 것!!

profile
성장하며 꿈꾸는 삶을 살아가고 있는 대학생입니다😊

0개의 댓글