# 문제
# 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ2745_1 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" "); // 공백으로 나누어 저장
String B = input[0].toUpperCase();
int N = Integer.parseInt(input[1]);
int[] az = new int['z' - 'a' + 1];
int x = 10;
// 문제에 출시된 A=10, B=11, ... Z=35 을
// index 계산하기 위해 순차적으로 저장.
for (int i = 0; i < az.length; i++) {
az[i] = x;
x += 1;
}
// 10진수 인지 아닌지 체크 (0~9 사이의 값인지)
// 문자가 있으면 해당 문자의 값을 구하여 azIndex에 저장
String[] azIndex = new String[B.length()];
for (int i = 0; i < B.length(); i++) {
char c = B.charAt(i);
if (c >= '0' && c <= '9') { // c가 0~9사이의 값이라면
azIndex[i] = String.valueOf(c); // azIndex[i]에 c 저장
} else { // 아니라면
int index = c - 'A'; // 문자열 위치 계산
azIndex[i] = String.valueOf(az[index]); // 해당 위치의 값 azIndex[i]에 저장
}
}
// azIndex를 N진법으로 계산.
int multiply = 1;
int result = 0;
int count = input[0].length();
for (int i = 0; i < input[0].length(); i++) { // 5
multiply = 1;
// 예시: 0번자리는 4번, 2번 자리는 3번, 3번 자리는 2번, 4번 자리는 1번, 5번 자리는 0
for (int j = count - 1; j > 0; j--) {
multiply = multiply * N;
}
count--;
result = result + (multiply * Integer.parseInt(azIndex[i]));
}
System.out.println(result);
br.close();
}
}
# 입/출력 결과
# 과정
- BufferedReader로 입력값 받기.
- String[] input에 입력값을 공백으로 나누어 저장.
- String B와 int N에 input[0], input[1] 값 저장.
- int[] az에 알파벳 개수 크기로 생성.
- int x = 10 선언 및 초기화. 나중에 필요.
- for문을 사용하여 문제에 출시된 A=10, B=11, ... , Z=35 설정하기 위해 az 배열에 순차적으로 x+=1 값을 저장.
- for문을 사용하여 10진수 인지 아닌지 체크를 위해 B의 한 글자씩 0~9의 숫자인지 비교하기.
- : 만약에 숫자면 azIndex[i] 위치에 c를 저장하고,
- : 숫자가 아니라면 알파벳 자리 계산하여 index에 저장하고
- : az[] 배열이 알파벳 순으로 값을 저장해 놓은 것이므로,
- : azIndex[i]에 az[index] 값을 저장
- azIndex에 담긴 값을 N진법으로 계산을 중첩 for문으로 계산
- : 예를들어, 5개의 문자로 이루어진거라면 0번째는 4번, 1번째는 3번, 2번째는 2번, 3번째는 1번, 4번째는 0번
- : 이러한 순으로 계산해야하기 때문에 바깥 for문은 int i = 0; input[0].lenght 만큼 반복.
- : 안쪽 for문은 int j = input[0].length - 1 값으로 해야하는데,
- : count에 input[0].length을 저장하고, int j = count - 1; 로 지정하여 0보다 작을때까지 j-- 로 반복
- : 그리고 count-- 하여 4, 3, 2, 1 반복, 3, 2, 1 반복할 수 있도록 설정.
- : 반복할 때마다 multiply = multiply * N 을 저장. (N은 진수법)
- : 안쪽 for문 끝날때마다 result에 result + (multiply * azIndex[i]) 값을 누적시켜준다.
- 마지막에 result 출력. 그리고 BufferedReader .close() 해주기
# 메모
- 처음에 문제를 이해 못해서 chat-gpt의 도움을 받았다.
- 그러니까 10진법과 36진법의 차이를 이해를 못해서 말이다...
- 2진법은 0, 1로 되어 있고, 10진법은 0~9로 이루어져 있고, 만약에 숫자+문자 형식이라면 25진법, 36진법이 된다는 건 이해했다. 그리고 5자리의 문자라고 하고 36진법으로 한다면 왼쪽에서 오른쪽 순으로 36의 4승, 36의 3승, 36의 2승, 36, x 이런 순이라는걸 알게되었다.
- 역시 수학 공부가 필요하다...
'코딩 테스트' 카테고리의 다른 글
[코딩테스트] 백준 2720번: 세탁소 사장 동혁 (0) | 2025.06.30 |
---|---|
[코딩테스트] 백준 2745번: 진법 변환 2 (0) | 2025.06.28 |
[코딩테스트] 백준 2563번: 색종이 (0) | 2025.06.26 |
[코딩테스트] 백준 10798번: 세로읽기 (0) | 2025.06.25 |
[코딩테스트] 백준 2566번: 최댓값 (0) | 2025.06.23 |