알고리즘/프로그래머스 2단계

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

게임만드는학생 2024. 8. 8. 12:59

https://school.programmers.co.kr/learn/courses/30/lessons/17687

 

프로그래머스

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

programmers.co.kr

 

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

string solution(int n, int t, int m, int p) {
    string answer = "";
    string num ="0123456789ABCDEF";
    string s="0";
    int id = p-1;
    for(int i=1;;i++)
    {
        string temp="";
        int tn = i;
        while(tn>0)
        {
            temp += num[tn%n];
            tn/=n;
        }
        reverse(temp.begin(),temp.end());
        s+=temp;
        
        if(id<s.length())
        {
            answer+=s[id]; id+=m;
        }
        if(answer.length()==t)break;
    }
    
    
    return answer;
}

 

369방식의 게임을 진행하는데 자신이 말할 번호를 미리 구하는 문제이다. 

몇진수로 미리 몇개의 자신이말할 숫자를 구할지, 총 몇명이며 자신은 몇번째인지를 매개변수로 준다. 

 

string num ="0123456789ABCDEF";

16진수까지의 한 자릿수로 표현가능한 수들을 num에 저장해놨다. 이 변수를 통해서 10진수를 n진수로 변환한다. 

 

string temp="";
        int tn = i;
        while(tn>0)
        {
            temp += num[tn%n];
            tn/=n;
        }
        reverse(temp.begin(),temp.end());
        s+=temp;

for문을 돌며 먼저 다음의 코드를 실행한다. 10진수를 n진수로 변환하는 코드이다. 

이 방식으로 바꾸면 4의 경우 001로 저장되기 때문에 reverse함수를 통해 100 으로 만들어준다. 

그 수를 s에 저장한다. 

 

if(id<s.length())
        {
            answer+=s[id]; id+=m;
        }
        if(answer.length()==t)break;

그리고 바로 자신이 말할 숫자를 저장한다. 

이 때, id는 p-1 부터 시작하는인덱스이다. 현재 구한 숫자들에서 자신이 말할 숫자를 선정할 수 있는 경우, 

answer에 추가하고 인덱스를 다음 숫자를 가리키게 한다. 

그리고 구할 숫자만큼 구했으면 종료한다. 

 

처음 문제를 잘못이해해서 시간을 많이 보냈다.

또한 for문의 마지막 과정을 따로 빼서 for문으로 실행했는데 이때는 첫번째 for문에서 얼만큼 숫자를 바꿔야하는지 임의로 정해야했기 때문에 큰수를 넣어서 시간이 좀 걸렸다. 

하지만 for문 하나로 합치면서 구해야할 숫자가 남아있는데 아직 부족하다면 그때마다 n진수로 변경하여 진행하는 방식으로 최적화하였다.  그리고 확연한 실행결과의 차이를 보였다.