알고리즘 공부(C++)

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

혀니리리 2023. 8. 12. 16:46
728x90

코딩테스트 연습 - [3차] n진수 게임 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

#include <string>
#include <vector>
#include <iostream>
using namespace std;
char list[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

string change(int num, int n)
{
    string result = "";
    while (num / n > 0)
    {
        string temp = result;
        result = list[num % n];
        result += temp;
        num /= n;
    }
    string temp = result;
    result = list[num % n];
    result += temp;
    return result;
}

string solution(int n, int t, int m, int p) {
    string answer = "";
    string str="";
    for(int i =0; i <= t * m; i++)
        str += change(i, n);
    for(int i = 0; i < t; i++)
        answer += str[m * i + p - 1];
    return answer;
}

100퍼센트 내힘으로 푼건 아니지만...

그래도 얻는게 있었던 문제

 

10진수-> n진수로 변환을 하려면

원래 num에서 n을 계속 나누며 나눗셈을 더해야하는것은 알았다.

하지만 평범하게 구현을 한다면 무조건 거꾸로 출력이 될텐데...

라는 생각이었는데, 천재적인 방법이 있었다.

 

1 ) result라는 string값을 지정한 다음,

2 ) for문을 돌 때마다 temp라는 또다른 string을 만들어서 지금까지 만들어진 result를 넣어주고

3 )새로 우리가 넣어줄 값을 result로 할당해주면 result의 맨 앞에 위치하게 된다.

4) 이 result에 temp를 붙여주면, 그때그때 string이 새로 할당이 되면서 마치 앞쪽에다 새로운 값을 붙이는 것처럼 할 수 있다.

이것이 vector보다 list(string)이 나은점..이랄까(기술면접에서 틀렸던 문제)

 

 

이것만 해결했다면 쉽다.

그 다음부터는 그냥 한사람씩 말할 긴 string을 우리가 앞서 만든 change함수를 통해 계속 붙여주면서 완성시킨다.

그 후, 해당하는 인덱스의 string 값을 answer에 붙여주면 그것이 정답이다.

 

틀렸던 이유

    for(int i =0; i <= t * m; i++)
        str += change(i, n);

이를 하는 과정에서, for문을 몇번이나 돌려야 할지 몰라서 그냥 i <= 1000으로 잡았었는데 계쏙 오답이 뜨더라...

아마도 2진수로 했을 경우 문자열이 지나치게 길어지며 string이 제대로 할당되지 않는 것이 원인이었을 듯 싶다.

테스트케이스를 고려할때는 가장 극단적으로 작은 값 뿐만 아니라, 큰값을 넣을 때를 고려해보자.

(그리고 내가 출력했을 때도 너무 비정상적으로 긴 무언가가 출력됐을 때는.. 오류의 원인이 시간초과나 그런것이 됐을 가능성도 있음.)

728x90