프로그래머스 - [3차] n진수 게임 (Lv.2)
문제 링크
문제 접근
- 0부터 차례대로 n진수로 변환한 문자열의 길이를 튜브가 t번 말할 수 있을 때까지 숫자를 증가시키며 n진수 변환을 해야 한다.
- 게임에 참가한 인원 m명이 모두 t번씩 말할 수 있을 길이로 n진수 문자열 변환 길이를 제한할 수 있으므로, len >= m * t 를 만족할 때까지 n진수 변환을 한다.
- 이때, 0은 항상 0으로 표현되고, 16진수까지 변환하므로 나머지가 10이 넘어가는 경우 A,B,C,.. 로 표현해야 한다.
- 변환된 n진수 문자열에서 튜브가 말하게 되는 인덱스를 찾으면 되고, 공식을 유도하면 index = p-1 + p*i (i>=0) 을 만족한다.
구현(All Pass)
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string ConvToNexp(int n, int num){
if(num == 0) return string(1, '0');
if(num/n == 0) {
int r = num%n;
if(r>=10){
r = 65 + (r-10);
return string(1, r);
}
return to_string(r);
}
int r = num%n;
if(r >= 10){
r = 65 + (r - 10);
return ConvToNexp(n, num/n) + string(1, r);
}
return ConvToNexp(n, num/n) + to_string(r);
}
void GetMathString(string& str, int len, int n, int num){
if(str.size()>=len) return;
str = str + ConvToNexp(n, num);
GetMathString(str, len, n, num+1);
}
string solution(int n, int t, int m, int p) {
string answer = "";
int len = m * t;
string str;
GetMathString(str, len, n, 0);
// cout << str << endl;
for(int i=0; i<t; i++){
answer.push_back(str[p-1 + m*i]);
}
return answer;
}
- 문자열로 변환하기 위해 사용하는 string(n, char) 은 char 문자를 n 개 붙여서 반환하는 함수이다. 따라서 char 자리에는 반드시 붙일 문자 가 와야한다.
- to_string(int) 함수는 int 정수를 문자열로 변환하는 함수이다. 즉, 숫자를 문자로 표현한다.
구현2
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string remainBiggerTen(int r){
char ch = 'A' + (r - 10);
return string(1, ch);
}
string convToFormat(int number, int fmt)
{
if (number / fmt == 0) {
if (number % fmt >= 10) {
return remainBiggerTen(number % fmt);
}
return to_string(number % fmt);
}
if (number % fmt >= 10) return convToFormat(number / fmt, fmt) + remainBiggerTen(number % fmt);
else return convToFormat(number / fmt, fmt) + to_string(number % fmt);
}
string solution(int n, int t, int m, int p) {
string answer;
string convStr = "0";
int minLen = m * t; // 구해야 하는 최소 변환 문자열 길이
int num = 1;
while(convStr.length() < minLen){
convStr += convToFormat(num++, n);
}
for(int turn = 1; turn <= minLen; turn++){
if(turn % m == p) answer.push_back(convStr[turn-1]);
if(turn % m == 0 && m == p) answer.push_back(convStr[turn-1]);
}
return answer;
}
Leave a comment