하루에 한 문제

[프로그래머스 2018 KAKAO BLIND RECRUITMENT] n진수 게임 -Java 본문

알고리즘/프로그래머스

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

dkwjdi 2021. 1. 23. 17:33

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

 

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

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

programmers.co.kr

class Solution {
	    public String solution(int n, int t, int m, int p) {
	    	// n:진법 , t:미리구할 숫자의 갯수, m:게임에 참가하는 인원, p : 튜브의 순서 
	    	StringBuilder answer = new StringBuilder();
	    	String []ABCDEF= {"A","B","C","D","E","F"};
	    	int num=0;
	    	int turn=1;
	    	
	    	while(true) {
	    		String s=changeJinsu(n,num,ABCDEF);
	    		for(int i=0; i<s.length(); i++){
	    			if(turn==p) {
	    				answer.append(s.charAt(i));
	    				if(--t==0) return answer.toString();
	    			}
	    			if(++turn>m) turn=1;
	    		}
	    		num++;
	    	}
	    }

		private String changeJinsu(int jinsu, int num, String[] ABCDEF) {
			StringBuilder result = new StringBuilder();
			int quotient=num, remainder=0;
			while(quotient>=jinsu) {
				remainder=quotient%jinsu; //나머지 구하기
				if(remainder>=10) result.append(ABCDEF[remainder-10]); //숫자 10이상이면 바꿔서 넣기
				else result.append(remainder);
				quotient/=jinsu; //몫 바꿔주기 
			}
			if(quotient>=10) result.append(ABCDEF[quotient-10]); //숫자 10이상이면 바꿔서 넣기
			else result.append(quotient);
			return result.reverse().toString();
		}
	}

소요시간 : 32분

 

우선 로직은

 

1.s에 현재의 num을 n진수로 바꾼 문자열을 넣어줍니다.

2.s의 길이만큼 for문을 돌면서 현재 턴이 튜브의 순서인지 확인해줍니다.

  2-1. 튜브의 순서라면 t를 하나 줄여주고 현재 문자열의 i번째를 answer에 추가해줍니다.

  2-2. 튜브의 순서가 아니라면 그냥 skip해줍니다.

3.숫자를 +1해줍니다.

 

 

그리고 10~16을 A~F로 바꿔주는 로직은 

String 배열에 ABCDEF를 넣어줍니다.

그리고 나머지가 10보다 크다면 그 수에서 10을 뺀 인덱스를 String배열에 접근시켜 문자열을 뽑아오면 됩니다.

 

만약 숫자가 12라면 -> 12-10 = 2  이것을 String배열의 인덱스로 사용하면 C가 나오게 됩니다!

 

 

Comments