프로그래머스의 [3차]n진수게임(Lv2) 문제이다.

 

[ 문제풀이 ]

n진수 게임을 하려고 할 때, 튜브가 말해야 하는 숫자들을 구해야 하는 문제이다.

문제에 접근하는 법 부터 정답도출까지 순차적으로 알아보자.

 

#1. 2 ~ 16진수에 대한 처리

문제에서 주어질 수 있는 진법은 2진법부터 16진법까지 나타날 수 있다고 했다.

그럼 이를 어떻게 한번에 표현하고 처리할지에 대해서부터 이야기를 해보자.

먼저 2진수는 '0'과 '1'로만 이루어져 있다.

3진수는 '0', '1', '2'로 이루어져 있을 것이다.

4진수는 '0', '1', '2', '3'으로 이루어져있을 것이다.

11진수는 '0', '1, '2,' ... 'A' 로 이루어져 있을 것이다.

13진수는 '0', '1', '2', ... 'A', 'B', 'C' 로 이루어져 있을 것이다.

16진수는 '0', '1', '2', ... 'A', 'B', 'C', 'D', 'E', 'F' 로 이루어져 있을 것이다.

본인이 2 ~ 16진수 중 몇가지만 뽑아서 정말 대충 어떤 숫자들로 이루어져 있는지 적어보았다.

위의 모든 진수들을 보면 다음과 같은 사실을 하나 알 수 있다.

2 ~ 16진수 중 어떤 진수든지 이를 이루고 있는 숫자의 범위는 0 ~ 'F' 이다. 라는 것이다.

따라서 본인은 간략하게 배열을 통해서 이 숫자들을 모두 저장해 주었다.

char List[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };

 

#2. 만들어야 하는 숫자의 갯수

그럼 우리는 총 몇개의 숫자를 미리 파악하고 있어야 할까 ??

바로 t * m 개이다. 왜 그럴까 ?? 이 문제에서 변수 't'는 "튜브가 말해야 하는 숫자의 갯수" 이다.

그리고 'm'은 "게임에 참가하는 인원 수" 이다.

예를 들어서 튜브가 말해야 하는 숫자가 4개이고(t = 4), 게임에 참가하는 인원의 수가 2명(m = 2) 이라면,

우리는 총 4 * 2 = 8 개의 숫자를 미리 만들어 두면, 이 중에서 튜브의 순서에 맞게 만든 숫자들 중에서 뽑아오기만 하면 되는 것이다.

 

#3. 숫자 변환하기

그럼 이제 숫자들을 변환하는 과정을 알아보자.

우리가 10진수를 2진수로 바꿀 때, 손으로 직접 풀 때는 2로 나눠가면서 그 나머지들을 적고, 그 나머지들을 순서대로 적게되면 2진수를 구할 수 있다.

똑같이 구현하였다. 다만 다른것은 n진수이기 때문에, 주어진 n으로 계속 나눠가면서 그 나머지들만 계속해서 적어주었다. 그런데 그 나머지가 어디 적혀있을까 ?? 바로 우리가 #1에서 했던 'List'라는 배열에서 우리는 이미 적어놓았다.

코드로 확인하면 다음과 같다.

char List[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };

string Invert(int Num, int n)
{
	string R_Value = "";
	while (Num / n != 0)
	{
		string Temp = R_Value;
		R_Value = List[Num % n];
		R_Value += Temp;
		Num /= n;
	}
	string Temp = R_Value;
	R_Value = List[Num % n];
	R_Value += Temp;
	return R_Value;
}

return 형은 그냥 string 그대로 반환해 주었다. 왜냐하면 우리가 최종적으로 구해야 하는 것도 string형이기도 하고, 이게 11진수 이상의 값들에서는 숫자가 아닌 'A', 'B'와 같은 char형의 숫자들이 필요하기 때문이다.

 

최종적으로는 #3에서 구한 string에서 튜브의 순서에 맞게 숫자들을 가져오기만 하면 된다.

 

[ 소스코드 ]

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
#include <string>
#include <vector>
 
using namespace std;
 
char List[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
 
string Invert(int Num, int n)
{
    string R_Value = "";
    while (Num / n != 0)
    {
        string Temp = R_Value;
        R_Value = List[Num % n];
        R_Value += Temp;
        Num /= n;
    }
    string Temp = R_Value;
    R_Value = List[Num % n];
    R_Value += Temp;
    return R_Value;
}
 
string solution(int n, int t, int m, int p) 
{
    string answer = "";
    string Result = "";
    int Cnt = 0;
    for (int i = 0; i < t * m; i++) Result += Invert(i, n);
    for (int i = p - 1; i < Result.length(),Cnt < t; i += m)
    {
        answer += Result[i];
        Cnt++;
    }
    
    return answer;
}
cs

 

+ Recent posts