본문 바로가기

코딩 테스트/프로그래머스

[프로그래머스] n진수 게임

프로그래머스

2018 KAKAO BLIND RECRUITMENT

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[3차] N진수 게임

 

문제 정리
1. 숫자를 0부터 시작해서 9까지 차례대로 말하는 게임
2. 10 이상부터는 한 자리씩 끊어서 말하는 것 but 숫자를 n진수로 바꿔서 게임을 한다....
3. 진법 n, 미리 구할 숫자의 개수 t, 게임에 참가하는 인원 m, 튜브의 순서 p 가 주어진다.
4.튜브가 말해야 할 문자열을 출력한다.
시작하기 전 접근 방법

 

1. 미리 구해야하는 문자 t개와 참가자 m 명이 존재하기 때문에 진법을 구해야 할 수를 t*m번 반복할 for문을 만든다.
2. n진수로 바꿀 Integer.toString(바꿀 숫자, n진법)을 이용한다 → String형반환
3. 반환한 String에서 튜브 차례를 구하고 해당 차례에 숫자를 subString을 이용하여 1개 가져온다.
4. 구해야 하는 String 길이가 t가 되면 반복문 종료 / 아니면 튜브 차례를 찾기 위해 튜브 순서에서 인원수만큼 플러스한다.

 

테스트 예제 값

 

 

 

1. 현재 차례와 튜브 차례를 설정할 변수를 먼저 생성한다.
int index = 0;  //현재 차례
int turn = p;   // 튜브 차례

 

 

2~4 t*m번 숫자를 반복해서 n진법 진수 값을 구한다. String형 tmp에서 값을 찾을 때 2번째 반복문이 돌 때마다 index순서를 1씩 증가시켜 순번이 돌고 있는 것을 표현하며 튜브차례랑 현재 차례가 같을 때 subString을 이용해서 문자 1개를 가져온다. 구해야 하는 answer이 t값과 같으면 반복문을 종료한다. 아니면 다음 튜브 차례를 구하기 위해 현재 튜프 차례에서 인원수만큼 증가시켜서 순번을 기다린다.
for(int i=0; i<t*m; i++){
	String tmp = Integer.toString(i,n).toUpperCase();
    	for(int j=0; j<tmp.length();j++){
        	index++;
            if(index==turn){
            	answer += tmp.substring(j,j+1);   
                
                if(answer.length()==t){ 
                    break;
                } 
           turn +=m;
           }
	}

 

 

실수한 부분
Integer.toString을 이용해서 n진법 수를 구했을 때 16진법을 계산할 경우 toUpperCase()를 사용하지 않으면 소문자로 출력이 된다. 하지만 문제에서 result는 다 대문자로 나와있기 때문에 대문자로 바꿔주는 toUpperCase()를 사용해서 대문자로 바꿔줘야지 틀리는 실수를 하지 않는다. 이 부분을 생각하지 않아서 사소한 실수가 발생했다!

 

 

전체 코드
더보기
class Solution {
    public String solution(int n, int t, int m, int p) {
        String answer = "";
        int index = 0;  //현재 차례
        int turn = p;   // 튜브 차례
        for(int i=0; i<t*m; i++){
            String tmp = Integer.toString(i,n).toUpperCase();
            for(int j=0; j<tmp.length();j++){
                index++;
                if(index==turn){
                 answer += tmp.substring(j,j+1);   
                
                if(answer.length()==t){ 
                    break;
                }ㅅ 
                    turn +=m;
                }
            }
        }
        return answer;
    }
}