[3차] n진수 게임

NJW·2022년 3월 5일
0

코테

목록 보기
12/170

들어가는 말

2018 카카오 블라인드 테스트 문제다. 91%가 맞췄다고 하던데 왜 난 못 맞춘 거죠...? ㅠㅠ... 중간에 잠깐 쉬었다고 이렇게 되기 있냐고요... 여튼...
숫자를 n진수로 변환해서 정해진 순서대로 말하는 문제다(자세한 해석은 프로그래머스를 참고). 총 숫자 배열을 구해서 튜브가 말하는 순서가 왔을 때 출력하면 된다고 생각했다. 총 숫자의 갯수는 t*m(튜브가 말해야 하는 숫자의 갯수 곱하기 게임에 참가하는 인원)인 것도 생각했다. 하지만, 문제는 그 다음이었는데...
2부터 16진수까지 변환을 해야 하는 데 어떻게 변환하면 좋을지 도저히 모르겠는 거 아닌가. 그래서 다른 사람들의 풀이를 봤다(도저히 모르겠다고요... 이걸 91%나 풀다니...).
참고한 블로그(https://sanghyu.tistory.com/121, https://yabmoons.tistory.com/627)에서는 문자 배열에 0부터 F까지 필요한 진수를 저장하고 시작했다. 만일 n이 2진수라고 하면 저장한 배열 중 0과 1만 사용하는 방식이다.
그렇게 해서 전체 문자열을 구하는 함수 number을 작성하고 solution 함수에는 전체 문자열(result)와 튜브가 말 해야 하는 번째의 숫자를 answer에 저장해서 답을 리턴하게 했다.

코드 설명

위에서 말한 것과 같이 필요한 진수들을 list에 문자형으로 저장을 한다. number는 진수로 바꿔주는 함수인데, while문을 돌면서 나머지가 가르키는 list를 tmp에 추가해주면 된다(그 숫자를 n으로 나눈 나머지를 전부 합하면 n진수의 값이니까). 다만, 반복문을 끝내고 나오는 tmp=list[num%n] + tmp는 용도가 뭔지 여전히 의문이다. 지우면 문제가 틀리던데 정확한 존재 이유가 뭘까...?
solution 함수에서는 전체 숫자를 구한 다음에 튜브가 원하는 숫자만 빼서 answer로 리턴하면 끝이 난다.

코드

#include <string>
#include <vector>

using namespace std;

char list[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

string number(int num, int n){
    string tmp = "";
    while(num/n != 0){
        tmp = list[num%n]+tmp;
        num=num/n;
    }
        tmp=list[num%n]+tmp;

    return tmp;
}

string solution(int n, int t, int m, int p) {
    string answer = "";
    string result = "";
    int cnt = 0;
    
    for(int i=0; i<t*m; i++){
        result += number(i,n);
    }
    
    for(int i=p-1; i<result.length(),cnt<t; i=i+m){
        answer += result[i];
        cnt++;
        
    }
    
    return answer;
}
profile
https://jiwonna52.tistory.com/

0개의 댓글