Written

프로그래머스 레벨2 <n진수 게임> C++ 풀이 본문

알고리즘 문제풀이

프로그래머스 레벨2 <n진수 게임> C++ 풀이

steeringhead 2023. 10. 9. 19:13

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

 

프로그래머스

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

programmers.co.kr

십진수의 수를 N진수로 변환하는 것이 핵심.

 

우리가 흔히 십진수를 이진수로 변환할때, 나누기를 하면서 몫이 0이 될때까지 나온 나머지들을 쭈욱 이어 모아 붙이는 방법을 사용한다. N진수 역시 똑같다. 하나의 특징은 십진수 이상부터는 A,B,C,D,E,F를 사용하여 십육진수까지 만든다는 것.이런 진법 변환 문제가 처음이면 다소 어려울 수 있지만, 종종 풀게되기 때문에 알아두어야하고 풀다보면 익숙해진다!

 

1. A,B,C,D,E,F같은 알파벳은 int형이 아니기 때문에 나머지를 받기 위한 arr 배열 생성.

2. 0부터 시작해서 사람수*단어갯수까지 진법을 변환해 만들어두자.

3. 변환해주는 함수 Invert에서 temp에 나머지를 몫이 0이될때 까지 받고 뒤집어주자(뒤집기 까지 해야 완전한 변환)

4. 변환된 수를 다 모아서 하나의 string에 더해주고, 내 차례부터 시작해서 m씩 건너뛰면서 나오는 값들을 반환할 정답 string에 더해준다.

5. 정답 string의 length가 t와 같아지면 종료.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string>
#include <vector>
 
using namespace std;
 
char arr[16= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
 
string Invert(int tmp,int n)
{    
    string temp = "";
    while(tmp != 0)
    {
        temp += arr[tmp%n];
        tmp = tmp/n;
    }
    if (temp == "")
        temp ="0";
    
    string res = "";
    for (int i=temp.length()-1;i>=0;i--)
    {
        res += temp[i];
    }
    
    return res;
}
 
string solution(int n, int t, int m, int p) {
    string answer = "";
    
    for (int i=0;i<m*t;i++)
    {        
        answer += Invert(i,n);                  
    }
    
    string res="";
    for (int i=p-1;i<answer.length();i+=m)
    {
        res += answer[i];
        if (res.length() == t)
            break;
    }
    
    return res;
}
cs
Comments