반응형
728x170
이것도 어렵다기보다.... 귀찮은 방법??
우선 다른 사람이 더 잘풀었을 것 같다.
나는 생각대로 코딩했다.
https://programmers.co.kr/learn/courses/30/lessons/17687
#내 맞는 풀이
#include <string>
#include <vector>
#include <iostream>
using namespace std;
//n을 x진법한 문자열 반환 -> 정방향으로 출력
string func(int n, int x){
string s = "";
int div = n;
//새로 추가되는 것들이 앞에옴
while(1){
if(div >= x){
int res = div%x;
if(res == 10){
s = 'A' + s;
}else if(res == 11){
s = 'B' + s;
}else if(res == 12){
s = 'C' + s;
}else if(res == 13){
s = 'D' + s;
}else if(res == 14){
s = 'E' + s;
}else if(res == 15){
s = 'F' + s;
}else{
s = to_string(res) + s;
}
div /= x;
}
if(div<x){
if(div == 10){
s = 'A' + s;
}else if(div == 11){
s = 'B' + s;
}else if(div == 12){
s = 'C' + s;
}else if(div == 13){
s = 'D' + s;
}else if(div == 14){
s = 'E' + s;
}else if(div == 15){
s = 'F' + s;
}else{
s = to_string(div) + s;
}
break;
}
}
return s;
}
string solution(int n, int t, int m, int p) {
string answer = "";
int temp = 0;
string x = "";
while(1){
string s = func(temp++, n); // 해당 숫자를 n진법한 숫자를 문자열로 받음.
cout << s << '\n';
//while 문 이므로 temp를 늘려서 차례대로 받음
x += s; // 기존이 앞에 새로운 것이 뒤에 오도록 추가.
if(x.size() >= m * t + p) break; // 최소한 문자열이 m * t + p개 이상 있다면 내가 t개를 말할 수 있음. -> while문에서 그만 문자열 받음.
}
//지금까지 숫자들 중 내가 말해야하는 것만 고름
int cnt = 0;
for(char s : x){
int turn = (cnt%m); // turn 번째 차례 -> m으로 나눈 나머지므로 나머지가 0이면 첫 번쨰 사람차례다.
cnt++;
//p번째 차례 -> 나머지 0,1,2....p-1일 때. p번째 차례.
if(turn == p-1){
answer.push_back(s);
if(answer.size() == t){
break;
}
}else continue; // 내차례 아니면 넘김.
}
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;
}
배울 점
-> 나보다 훨씬 간단히 했다.
예외 처리도 간단하고 이해한다면 간단 명료하다.
진법으로 만드는 것 자체가.
해당 십진법 숫자가 주어져있을 때.. 자리 수에 들어갈 자리를 만드는 것이니 말이다.
//num을 n진법으로 만든 문자열 반환
string number_to_n(int num, int n){
string result;
if(num == 0){
return "0";
}
//0보다 큰 숫자라면
while(num > 0){
result += number[num % n]; // 해당 숫자를 result에 더해주고
num /= n; // num이 0보다 크다는 것은 num이 n으로 나눴을 때 몫이 1 이상 존재한다는 말이다. -> 즉, 나눌 수 있다는 말
}
//result에 추가할 때 +=으로 추가했으므로 역순을 배열되어 있다.
//따라서 reverse로 역정렬해준다.
reverse(result.begin(), result.end());
return result;
}
728x90
반응형
그리드형
'문제풀이(Problem Solving)' 카테고리의 다른 글
프로그래머스, 카펫 : C++ [CPP] (0) | 2021.11.15 |
---|---|
프로그래머스, 숫자의 표현 : C++ [CPP] (0) | 2021.11.12 |
프로그래머스, 다음 큰 숫자 : C++ [CPP] (0) | 2021.11.11 |
프로그래머스, 땅따먹기 : C++ [CPP] (0) | 2021.11.11 |
프로그래머스, 피보나치 수 : C++ [CPP] (0) | 2021.11.10 |