알고리즘 문제/프로그래머스

[프로그래머스 - Java] N진수 게임 (2018 KAKAO BLIND RECRUITMENT)

건복치 2021. 5. 8. 03:11
반응형

문제

programmers.co.kr/learn/courses/30/lessons/17687

 

코딩테스트 연습 - [3차] n진수 게임

N진수 게임 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0

programmers.co.kr

설명

우선 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

 

KwonMinha/Programmers

Programmers Algoritm. Contribute to KwonMinha/Programmers development by creating an account on GitHub.

github.com

 

반응형