문제
programmers.co.kr/learn/courses/30/lessons/17687
설명
우선 10진수로 표현된 수를 n진법으로 변환시켜야 한다. (10진수 n진수 변환은 아래에서 설명)
변환된 수를 ArrayList에 차곡차곡 저장한다.
튜브 순서에 말할 수가 List에 없다면 현재 튜브 순서의 숫자를 진수 변환시켜 List에 저장하는 것을 반복하며 게임을 진행한다.
10진수로 N진수 구하기
1. List, Stack과 같은 자료구조 등에 int, char, String형등 원하는 대로 변환된 숫자를 각 자릿수 별 저장해도 되고
2. StringBuilder, String 변수로 변환된 숫자 통으로 저장해도 된다.
1. Stack에 변환된 N진수 저장
- 매개변수 value가 10진수 숫자값
- 매개변수 N이 변환할 진수 값
- 진법 계산 시 일의 자리부터 계산되기 때문에 스택에 넣고, 모두 변환 후에 가장 큰 자릿수부터 pop 해서 빼는 것이다.
- 전역 변수로 선언된 static ArrayList<String> numberList에 변환된 수가 자릿수 별로 차곡차곡 저장됨
public static void conversion(int value, int N){
Stack<String> stack = new Stack<>();
while(value > 0){
if(value % N < 10) { // 나머지가 10 이상일때(즉 11진수 이상일때) 문자열 배당
stack.push((value % N) + "");
} else {
stack.push((char)(value % N + 55) + ""); // 그외는 나머지 숫자값 넣기
}
value /= N;
}
// 입력수가 0일 때는 결과값 0
if(stack.isEmpty()) {
numberList.add("0");
}
// 0이외의 값이라면 스택에서 값 추출
while(!stack.isEmpty()) {
numberList.add(stack.pop());
}
}
2. StringBuilder에 변환된 N진수 저장
- 1번 방법인 스택에 넣어서 입력과 달리 거꾸로 pop 한 거처럼 reverse() 메서드를 이용해 거꾸로 숫자를 넣어줘야 정상적으로 변환된 숫자를 얻을 수 있음
- 자릿수 별로 숫자를 저장할 것이 아니라 변환된 숫자를 통으로 얻을 땐 주석처럼 바로 변환된 숫자를 리턴해주면 된다.
public static void conversion2(int value, int n) {
StringBuilder sb = new StringBuilder();
while(value > 0){
if(value % n > 9) { // 나머지가 10 이상일때(즉 11진수 이상일때) 문자열 배당
sb.append((char) (value % n + 55) + "");
} else { // 그외는 나머지 숫자값 넣기
sb.append((value % n) + "");
}
value = value / n;
}
// 입력수가 0일 때는 결과값 0
if(sb.toString().equals("")) {
numberList.add("0");
} else {
String[] arr = sb.reverse().toString().split(""); // 거꾸로 넣어줘야 함
for(String s : arr) {
numberList.add(s);
}
}
//return sb.toString().equals("") ? "" : sb.reverse().toString();
}
전체 코드
import java.util.ArrayList;
import java.util.Stack;
class Solution {
static ArrayList<String> numberList;
public String solution(int n, int t, int m, int p) {
String answer = "";
int intNum = 0;
// 튜브 순서 시작 전 튜브가 말할 숫자가 있도록 초기 리스트 만듬
numberList = new ArrayList<>();
while(numberList.size() < p) {
conversion(intNum, n);
intNum++;
}
// 튜브 순서부터 시작
for(int i = p; i <= t * m; i += m) {
while(numberList.size() < i) { // 튜브 순서에 말할 숫자가 없으면 추가
conversion(intNum, n);
intNum++;
}
// 튜브가 말할 순서와 숫자 리스트의 인덱스가 대응 (1부터 시작하니까 -1 해줌)
answer += numberList.get(i-1);
}
return answer;
}
public static void conversion(int value, int N){
Stack<String> stack = new Stack<>();
while(value > 0){
if(value % N < 10) { // 나머지가 10 이상일때(즉 11진수 이상일때) 문자열 배당
stack.push((value % N) + "");
} else {
stack.push((char)(value % N + 55) + ""); // 그외는 나머지 숫자값 넣기
}
value /= N;
}
// 입력수가 0일 때는 결과값 0
if(stack.isEmpty()) {
numberList.add("0");
}
// 0이외의 값이라면 스택에서 값 추출
while(!stack.isEmpty()) {
numberList.add(stack.pop());
}
}
}
GITHUB
github.com/KwonMinha/Programmers/blob/master/2018_Kakao_Blind_Recruitment/src/NGame.java
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 - Java] 주식 가격 (0) | 2021.06.10 |
---|---|
[프로그래머스 - Java] 다리를 지나는 트럭 (3) | 2021.06.10 |
[프로그래머스 - Java] 징검다리 건너기 (2019 카카오 개발자 겨울 인턴십) (1) | 2021.02.06 |
[프로그래머스 - Java] 경주로 건설 (2020 카카오 인턴십) (0) | 2021.01.31 |
[프로그래머스 - Java] 신규 아이디 추천 (2021 KAKAO BLIND RECRUITMNET) (0) | 2021.01.29 |
댓글