{ }codelper
진법 바꾸기글자 코드P0093

a진법을 b진법으로

a진법으로 쓴 수 하나를 b진법으로 바꾸어 출력하라.
자리 값이 10 이상이면 영어 대문자를 쓴다: A = 10, B = 11, …, Z = 35.
입력과 출력 모두 맨 앞에 쓸데없는 0을 붙이지 않는다(값이 0이면 0 한 글자). 첫 줄에 a와 b가 빈칸으로 나뉘어, 둘째 줄에 a진법으로 쓴 수가 주어진다.

입력
2 ≤ a, b ≤ 36, 수는 0 이상이고 10진법으로 10¹⁵ 이하, 각 자리는 0~9 또는 A~Z이며 a보다 작은 값이다
출력
b진법으로 쓴 수(대문자, 맨 앞에 0 없음)
예시 1 · stdin
16 2
FF
stdout
11111111
예시 2 · stdin
10 36
1295
stdout
ZZ
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

읽을 때는 앞 자리부터 값 = 값 × a + 자리 값, 쓸 때는 값 % b가 맨 끝 자리라서 나눌 때마다 글자를 앞에 붙이거나 다 모은 뒤 뒤집어요.
바로 쓰는 도구가 언어마다 달라요: Python int(s, a)는 2~36진법을 읽지만 b진법으로 쓰는 함수는 없어요(bin·oct·hex뿐).
Java는 Long.parseLong(s, a)와 Long.toString(v, b)가 둘 다 2~36을 받고, JavaScript·TypeScript도 parseInt(s, a)와 v.toString(b)가 있어요 — 단 toString은 소문자(ff)를 내서 toUpperCase()가 필요해요.
C는 strtoll(s, NULL, a), C++는 std::stoll(s, nullptr, a)로 읽고 쓰기는 직접 해요.
C#은 Convert.ToInt64(s, base)·Convert.ToString(v, base)가 2·8·10·16진법만 받아서 나머지는 예외가 나요 — 그래서 둘 다 직접 해요.
크레이콘은 DIGITS = "0123…Z"를 두고 DIGITS.자리찾기(ch)로 자리 값을, DIGITS[v % b]로 글자를 얻고, 몫은 수학.몫(v, b)예요.
함정 넷: 글자 자리 값을 모두 c - '0'으로 구하면 'A'가 10이 아니라 17이 돼요(C·C++·Java·C#의 문자 빼기).
값이 0이면 while (v > 0)을 한 번도 돌지 않아 빈 줄이 나와요(C·C++ 풀이는 do-while로 막았어요).
낮은 자리부터 나온 글자를 뒤에 붙이면 차례가 거꾸로예요.
그리고 10¹⁵는 int를 넘으니 long/long long을 써요(JavaScript·크레이콘은 2^53까지 정확해서 괜찮아요).

Pythonmain.py · 14 줄
DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" a, b = map(int, input().split())s = input().strip() value = int(s, a)  # int()는 2~36진법 글자를 바로 읽는다(A = 10 … Z = 35)if value == 0:    print("0")else:    out = []    while value > 0:        out.append(DIGITS[value % b])  # 낮은 자리부터 나온다        value //= b    print("".join(reversed(out)))
JavaScriptmain.js · 6 줄
const [line1, s] = require("fs").readFileSync(0, "utf8").trim().split(/\r?\n/);const [a, b] = line1.split(" ").map(Number); // parseInt와 toString은 2~36진법을 받는다. toString은 소문자를 내서 대문자로 바꾼다const value = parseInt(s.trim(), a);console.log(value.toString(b).toUpperCase());
TypeScriptmain.ts · 7 줄
import { readFileSync } from "node:fs";const [line1, s] = readFileSync(0, "utf8").trim().split(/\r?\n/);const [a, b]: number[] = line1.split(" ").map(Number); // parseInt와 toString은 2~36진법을 받는다. toString은 소문자를 내서 대문자로 바꾼다const value: number = parseInt(s.trim(), a);console.log(value.toString(b).toUpperCase());
JavaMain.java · 12 줄
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int a = sc.nextInt(), b = sc.nextInt();        String s = sc.next();        // Long.parseLong와 Long.toString은 2~36진법을 받는다. toString은 소문자를 내서 대문자로 바꾼다        long value = Long.parseLong(s, a);        System.out.println(Long.toString(value, b).toUpperCase());    }}
C#Main.cs · 31 줄
using System;using System.Text; class Program{    const string Digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";     static void Main()    {        string[] ab = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int a = int.Parse(ab[0]), b = int.Parse(ab[1]);        string s = Console.ReadLine().Trim();         // Convert.ToInt64(s, base)는 2·8·10·16진법만 받아서 직접 바꾼다        long value = 0;        foreach (char ch in s) value = value * a + Digits.IndexOf(ch);         if (value == 0)        {            Console.WriteLine("0");            return;        }        var sb = new StringBuilder();        while (value > 0)        {            sb.Insert(0, Digits[(int)(value % b)]); // 낮은 자리부터 나오니 앞에 끼운다            value /= b;        }        Console.WriteLine(sb);    }}
C++main.cpp · 20 줄
#include <algorithm>#include <iostream>#include <string> int main() {    const std::string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";    int a, b;    std::string s;    std::cin >> a >> b >> s;     long long value = std::stoll(s, nullptr, a); // stoll은 2~36진법을 읽는다     std::string out;    do {        out += digits[value % b]; // 낮은 자리부터 나온다. do-while이라 0도 "0"이 된다        value /= b;    } while (value > 0);    std::reverse(out.begin(), out.end());    std::cout << out << '\n';}
Cmain.c · 21 줄
#include <stdio.h>#include <stdlib.h> int main(void) {    const char *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";    int a, b;    char s[64];    scanf("%d %d %63s", &a, &b, s);     long long value = strtoll(s, NULL, a); /* strtoll은 2~36진법을 읽는다 */     char out[64];    int len = 0;    do {        out[len++] = digits[value % b]; /* 낮은 자리부터 나온다. do-while이라 0도 "0"이 된다 */        value /= b;    } while (value > 0);    for (int i = len - 1; i >= 0; i--) putchar(out[i]);    putchar('\n');    return 0;}
Craykonmain.cray · 28 줄
DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ab = 콘솔.수들읽기();a = ab[0];b = ab[1];s = 콘솔.줄읽기().공백제거(); // a진법 글자를 앞에서부터 읽는다: 지금까지의 값 × a + 이 자리 값value = 0;각각 (ch 에서 s){    value = value * a + DIGITS.자리찾기(ch);} 만약 (value == 0){    콘솔.쓰기("0");}아니면{    out = "";    동안 (value > 0)    {        out = DIGITS[value % b] + out; // 낮은 자리부터 나오니 앞에 붙인다        value = 수학.몫(value, b);    }    콘솔.쓰기(out);}