#1. 문제
#2. 풀이
1. N진수 변환
// N진법 변환 함수
string decimalToBase(int decimal, int base) {
string result = "";
if (decimal == 0) {
return "0";
}
while (decimal > 0) {
int remainder = decimal % base;
if (remainder < 10) {
result.push_back('0' + remainder);
} else {
result.push_back('A' + remainder - 10);
}
decimal /= base;
}
reverse(result.begin(), result.end());
return result;
}
10진수 숫자를 N진수 변환하는 작업은 10진수 숫자를 계속해서 n으로 나눈 나머지 값을 이어주면 됩니다. 이때, 나머지 값이 10 이상일 경우, 이를 A~F로 변경해 주는 작업을 추가적으로 작성해 줍니다. 마지막으로, 문자열을 뒤집어 주어 10진수 숫자를 N진수 숫자로 변환한 문자열을 반환해 줍니다.
2. t*m 만큼 숫자들을 구하고, 여기서 p-1부터 m번째 숫자들을 저장하자
- 먼저, 튜브가 필요한 숫자들은 0 ~ t*m 범위 안에 존재합니다. 따라서, 이 범위 안에 숫자들을 모두 N진법 변환해 주어 기억합니다.
- 그리고, p-1 ~ t*m까지 m번째 숫자마다 그 값을 정답 목록에 추가해 주면 됩니다.
#3. 코드
// 정답 코드/*
@링크: https://school.programmers.co.kr/learn/courses/30/lessons/17687
@문제: 0~t 숫자를 N진법으로 변환 후 오른쪽 자릿수로 끊어서 차례대로 말하기, N진법 변환
@설명:
*/
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// N진법 변환 함수
string decimalToBase(int decimal, int base) {
string result = "";
if (decimal == 0) {
return "0";
}
while (decimal > 0) {
int remainder = decimal % base;
if (remainder < 10) {
result.push_back('0' + remainder);
} else {
result.push_back('A' + remainder - 10);
}
decimal /= base;
}
reverse(result.begin(), result.end());
return result;
}
string solution(int n, int t, int m, int p) {
if (n < 2 || n > 16 || t < 1 || m < 1 || p < 1 || p > m) {
return ""; // 유효하지 않은 입력
}
string sequence = "0";
int num = 1;
while (sequence.length() < t * m) {
sequence += decimalToBase(num++, n);
}
string answer = "";
for (int i = p - 1; i < t * m; i += m) {
answer += sequence[i];
}
return answer;
}