[프로그래머스] 17687. n진수 게임
문제 링크
풀이 과정
맨 먼저 숫자( num
)를 하나씩 증가시키며 n
진법으로 변환하여 표기합니다.
String converted = convert(num++, n);
10진수 num 을 n 진법으로 표기한 문자열로 변환하는 convert() 메소드는 아래와 같습니다. 해당 진수로 계속 나누고, 그 나머지를 붙여가는 방식으로 진수 변환을 진행했습니다.
public static String convert(int num, int radix) {
if (num == 0) return "0";
String converted = "";
while (num > 0) {
int quotient = num / radix;
int remainder = num % radix;
switch (remainder) {
case 10:
converted = 'A' + converted; break;
case 11:
converted = 'B' + converted; break;
case 12:
converted = 'C' + converted; break;
case 13:
converted = 'D' + converted; break;
case 14:
converted = 'E' + converted; break;
case 15:
converted = 'F' + converted; break;
default:
converted = remainder + converted;
}
num = quotient;
}
return converted;
}
위 함수에서 파라미터 radix 는 변환되는 진법을 의미하며, 이 값이 11 이상인 경우 나머지는 10 이상의 수가 나올 수 있습니다. 예를 들어, 아래와 같이 10진수 10 을 11진법으로 변환하면, 문자열 10
이 아닌 A
로 표현되야 합니다.
위와 같이 10 진법을 넘어가는 순간, 나머지가 10 이상이 되어, 나머지를 그대로 붙이게 되면 진법 변환은 잘못 이루어집니다. 문제에서는 16진법까지 표현이 가능하다고 하므로, 나머지 값 10 부터 15까지를 각각 A부터 F까지로 치환해 문자열에 이어 붙여 줬습니다.
위 함수로 변환된 문자열을 순회하며 튜브를 포함해 게임에 참가한 나머지 인원들이 순서대로 하나씩을 말하게 됩니다.
진법( n ) : 2
미리 구할 숫자의 개수( t ) : 4
게임에 참가하는 인원( m ) : 2
튜브의 순서( p ) : 1
예를 들어, 위 문제에서 주어진 입력 예시에 따르면 아래와 같이 튜브가 숫자를 취할 수 있게 됩니다.
count 변수를 하나씩 증가시킬 때, 튜브는 count % m == p
인 순간 해당 단어를 말해야 합니다. 위 예시의 경우, 1, 3, 5, 7 모두 m 값 2 로 나눈 나머지는 1 이 됩니다.
하지만, 만약 위 예시에서 그룹내 튜브의 순서가 제일 마지막이라면, 위 수식 count % m
결과 값은 0이 됩니다. 따라서, 튜브가 그룹의 가장 맨 뒤에 위치할 때에는 다른 조건을 줄 필요가 있었습니다. 튜브가 그룹 내 맨 뒤에 위치함은 수식 count % m == 0 && m == p
으로 표현할 수 있습니다.
코드
Java
public class Main {
public static String solution(int n, int t, int m, int p) {
String answer = "";
int num = 0;
int count = 1;
boolean exit = false;
while (!exit) {
String converted = convert(num++, n);
for (char c : converted.toCharArray()) {
if (t == 0) {
exit = true;
break;
}
if (count % m == p || (count % m == 0 && m == p)) {
answer += c;
t--;
}
count++;
}
}
return answer;
}
public static String convert(int num, int radix) {
if (num == 0) return "0";
String converted = "";
while (num > 0) {
int quotient = num / radix;
int remainder = num % radix;
switch (remainder) {
case 10:
converted = 'A' + converted; break;
case 11:
converted = 'B' + converted; break;
case 12:
converted = 'C' + converted; break;
case 13:
converted = 'D' + converted; break;
case 14:
converted = 'E' + converted; break;
case 15:
converted = 'F' + converted; break;
default:
converted = remainder + converted;
}
num = quotient;
}
return converted;
}
public static void main(String[] args) {
solution(2, 4, 2, 1);
// solution(16, 16, 2, 1);
// solution(16, 16, 2, 2);
}
}
Javascript
const solution = (n, t, m, p) => {
let answer = "";
let num = 0;
let count = 1;
let exit = false;
while (!exit) {
let converted = convert(num++, n);
for (c of converted) {
if (t == 0) {
exit = true;
break;
}
if (count % m == p || (count % m == 0 && m == p)) {
answer += c;
t--;
}
count++;
}
}
return answer;
};
const convert = (num, radix) => {
if (num == 0) return "0";
let converted = "";
while (num > 0) {
let quotient = num / radix;
let remainder = num % radix;
switch (remainder) {
case 10:
converted = "A" + converted;
break;
case 11:
converted = "B" + converted;
break;
case 12:
converted = "C" + converted;
break;
case 13:
converted = "D" + converted;
break;
case 14:
converted = "E" + converted;
break;
case 15:
converted = "F" + converted;
break;
default:
converted = remainder + converted;
}
num = parseInt(quotient);
}
return converted;
};
solution(2, 4, 2, 1);
// solution(16, 16, 2, 1);
// solution(16, 16, 2, 2);
댓글남기기