[C++로 풀이] n진수 게임⭐⭐

Date:     Updated:

카테고리:

태그:

📌 n진수 게임

난이도 ⭐⭐

🚀 문제

image


🚀 내 풀이 ⭕

#include <string>
#include <vector>

using namespace std;

char IntToChar(int num) {
    switch (num) {
        case 0: case 1: case 2: case 3: case 4:
        case 5: case 6: case 7: case 8: case 9:
            return '0' + num;
        case 10:
            return 'A';
        case 11:
            return 'B';
        case 12:
            return 'C';
        case 13:
            return 'D';
        case 14:
            return 'E';
        case 15:
            return 'F';
    }
}

int CharToInt(char num) {
    switch (num) {
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
        return num - '0';
    case 'A':
        return 10;
    case 'B':
        return 11;
    case 'C':
        return 12;
    case 'D':
        return 13;
    case 'E':
        return 14;
    case 'F':
        return 15;
    }
}

string solution(int n, int t, int m, int p) {
    string answer = "";

    string prevNum = "0";
    string totalStr = "0";
    while (totalStr.length() < t * m) {
        for (int i = prevNum.length() - 1; i >= -1; --i) {
            if (i == -1) {
                prevNum = "1" + prevNum;
                break;
            }

            int num = CharToInt(prevNum[i]);
            if (num + 1 == n) 
                prevNum[i] = '0';
            else {
                prevNum[i] = IntToChar(num + 1);
                break;
            }
        }
        totalStr += prevNum;
    }

    int count = 0;
    for (int i = 0, count = 0; count < t; i++) {
        if (i % m == p - 1){
            count++;
            answer += totalStr[i];
        }
    }

    return answer;
}
  • 첫 번째 : while문
    • 예를 들어 이진법 (n = 2)에서 11에 1을 더하면, 즉 11의 다음 수는 100이다.
      • 뒷자리부터 1을 더해서 2가 되면 일단 그 자리는 0으로 만들고 앞자리에 다시 1을 더하러 가야한다. (1 올림)
      • 최상위 앞자리까지 와서도 1을 더했을때 2가 되버린다면 한 자리 더 늘어야 한다는 것이므로 맨 앞에 1을 추가해준다. 이를 i == -1 이 됐을 때 처리함
    • 예를 들어 16진법 (n = 16)에서 BBA에 1을 더하면, A + 1B이므로 그대로 BBB가 된채로 종료. AAFF에 1을 더하면 2칸 더 앞에 가서 비로소 A = 1 = B로 16이 되지 않으므로 AB00 되고 종료
    • 이렇게 기존 prevNum을 수정하여 1을 더한 새로운 prevNum을 만들고 이를 totalStr에 이어 붙인다. totalStr엔 해당 진법의 0부터 시작한 수들이 차례차례 문자열로서 붙여지게 된다.
    • 위 과정은 totalStr.length() >= t * m 이 될 때까지 진행하기로 했다. t개 구해놔야 하고 사람은 m명이니까 t 번째 턴까지는 구해놔야 한다는 것이니 전체 t * m 개 이상이 될 때까지만 구하면 된다.
  • 두 번째 : for문
    • i % m == p - 1 일 때가 튜브가 말해야할 타이밍이다.
      • 튜브가 말한 횟수가 t번이 되면 종료한다.

저렇게 switch문 일일이 쓸 필요없이 “0123456789ABCDEF” 문자열에서 인덱스로 접근해도 괜찮았을 것 같다..



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Programmers 카테고리 내 다른 글 보러가기

댓글 남기기