컴퓨터/프로그래머스
프로그래머스 - 17687번: [3차] n진수 게임 [Java]
이상한 나그네
2023. 10. 28. 00:18
문제: https://school.programmers.co.kr/learn/courses/30/lessons/17687
1. 코드
import java.util.*;
class Solution {
public String solution(int n, int t, int m, int p) {
StringBuilder answer = new StringBuilder();
int cnt = 0;
for(int i = 0; answer.toString().length() < t; i++) {
String s = convert(n, i);
for(char c : s.toCharArray()) {
if(cnt % m == p - 1)
answer.append(c);
if(answer.toString().length() == t) break;
cnt++;
}
}
return answer.toString();
}
private String convert(int n, int num) {
StringBuilder sb = new StringBuilder();
if(num == 0) sb.append(0);
while(num > 0) {
if(num % n < 10)
sb.append(num % n);
else
sb.append((char)(num % n - 10 + 'A'));
num /= n;
}
return sb.reverse().toString();
}
}
2. 설명
private String convert(int n, int num) {
StringBuilder sb = new StringBuilder();
if(num == 0) sb.append(0);
while(num > 0) {
if(num % n < 10)
sb.append(num % n);
else
sb.append((char)(num % n - 10 + 'A'));
num /= n;
}
return sb.reverse().toString();
}
StringBuilder를 사용하여 n은 진수를 나타내며 num은 10진수를 기준으로 저장된 수이며 convert 함수는 10진수인 num을 n진수로 변환시켜주는 함수입니다. 만약 num % n이 10 이상이라면 문자열 'A'부터 'F'로 이루어집니다.
public String solution(int n, int t, int m, int p) {
StringBuilder answer = new StringBuilder();
int cnt = 0;
for(int i = 0; answer.toString().length() < t; i++) {
String s = convert(n, i);
for(char c : s.toCharArray()) {
if(cnt % m == p - 1)
answer.append(c);
if(answer.toString().length() == t) break;
cnt++;
}
}
return answer.toString();
}
반복문은 answer의 길이가 t만큼될 때까지 반복합니다. convert 함수에서의 반환된 값을 문자열 s에 저장한 뒤 문자열의 요소를 문자로 분리하여 튜브의 순서인 p가 되면 answer에 추가하는데 문자열의 문자를 읽을 때마다 순서가 바뀐다.
1.숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.
2. 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.
위 조건 중 2번째 조건은 10진수로 10이상이 아닌 정확히는 n진수로 변환된 값이 2자리 이상인 경우를 의미하며 이 부분을 이해하면 10진수로는 2를 2진수로 변환하면 10이며 이때 1과 0을 따로 분리하며 한명의 차례로 인정합니다.
위 그림은 입출력 예제의 첫번째 케이스입니다. 0부터 4까지의 과정이며 튜브가 말해야하는 숫자는 0111입니다.
3. 정리
- 문제에서 요구하는 것을 다르게 이해해서 오래걸렸다.
- 문제를 쉽게 이해한다면 빠르게 해결 가능하다.
출처: 프로그래머스 코딩 테스트 연습,
https://school.programmers.co.kr/learn/challenges