문제풀이(Problem Solving)

프로그래머스, [3차] n진수 게임 : C++ [CPP]

게임이 더 좋아 2021. 11. 11. 21:14
반응형
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
반응형
그리드형