문제 설명
입출력 예시
요약
양의 정수(0포함) 하나씩 n진수로 변환 후 내 순서의 숫자로만 이루어진 배열 만들기
풀이
접근 방식
1. n진수 변환 메소드 trans()
→ 0부터 1씩 증가시키며 n진수로 변환
→ 10~15는 A~F로 변환
2. 내 차례에 해당하는 숫자만 고르기
→ 인원수가 m이라면, int i = 0부터 시작하는 for문에서 i를 m으로 나눈 나머지에 1을 더한 수 (i % m + 1)가 자신의 차례와 같은지 비교
3. 턴 수가 넘어간 문자는 자르기
→ t번 차례까지만 구하면 되므로, 그 이상의 문자들은 substring으로 제거
코드리뷰
import java.util.*;
class Solution {
int max; // 변환할 n진수의 max length
public String trans(int n) { // n진수 변환 메소드
List<String> list = new ArrayList<>();
int num = 0; // 0부터 시작
String result = "";
while(true) { // 변환한 최종 문자열의 길이가 max 이상이 될 때까지 반복
int number = num; // 지역 변수 number에 num 담기
while(true) { // number 나누기 n 의 몫이 0이 될 때까지 반복
if(number / n == 0) {
list.add(0, String.valueOf(number % n));
break; // 몫이 0이라면 list에 담고 탈출
} else {
list.add(0, String.valueOf(number % n));
number /= n; // 몫이 0이 아니라면 list에 담고 number /= n 실행
}
}
for(String str : list) { // 10~15는 A~F로 변환
if(str.equals("10")) {
str = "A";
} else if(str.equals("11")) {
str = "B";
} else if(str.equals("12")) {
str = "C";
} else if(str.equals("13")) {
str = "D";
} else if(str.equals("14")) {
str = "E";
} else if(str.equals("15")) {
str = "F";
}
result += str; // list의 숫자를 차례대로 담아서 n진수 만들기
}
list.clear(); // 다음 양의 정수(number)를 변환한 문자를 담기위해 list 비우기
if(result.length() >= max) { // 변환한 최종 문자열의 길이가 max 이상이면 탈출
break;
} else { // 아니면 다음 양의 정수 변환 시작
num++;
}
}
return result;
}
public String solution(int n, int t, int m, int p) {
max = m * t; // 변환할 문자열의 총 길이는 인원수(m)와 내가 게임에 임하는 턴(t)의 곱으로 설정
String result = trans(n);
String answer = "";
for(int i = 0; i < result.length(); i++) {
if((i % m) + 1 == p) { // 변환된 문자열에서 나의 턴에 속하는 문자만 추출
answer += result.charAt(i);
}
}
return answer.substring(0, t); // 정해진 턴(t)의 길이 만큼만 잘라서 return
}
}
'알고리즘 > PROGRAMMERS' 카테고리의 다른 글
대충 만든 자판(Lv.1) (0) | 2024.04.11 |
---|---|
상품을 구매한 회원 비율 구하기(DB) (1) | 2024.03.28 |
게임 맵 최단거리(Lv.2) (0) | 2024.03.27 |
k진수에서 소수 개수 구하기(Lv.2) (0) | 2024.03.25 |
압축(Lv.2) (0) | 2024.03.25 |