
내가 생각했을때 문제에서 원하는부분
첫째 줄에 1개 이상의 알파벳 대문자로 이루어진 열 문자열이 주어진다.
입력 문자열의 길이는 10을 넘지 않는다.
첫째 줄에 열 순서를 출력한다.
내가 이 문제를 보고 생각해본 부분
초기 설정:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 콘솔로부터 입력을 효율적으로 읽어들이기 위해 BufferedReader를 사용한다.
String columnString = br.readLine();: 사용자로부터 엑셀 열 문자열을 한 줄로 입력받아 columnString 변수에 저장한다.
예를 들어, AZ가 입력될 수 있다.
long result = 0;: 최종 계산된 열 순서를 저장할 변수이다.
입력 문자열의 길이가 최대 10이기 때문에 결과값이 매우 커질 수 있다.
따라서 int 대신 long 타입을 사용하여 오버플로우를 방지한다.
long powerOf26 = 1;: 이 변수는 각 자리수에 곱해질 26의 거듭제곱 값을 저장한다.
가장 오른쪽 문자('C1')에는 26^0 = 1이 곱해지고, 그 다음 왼쪽 문자('C2')에는 26^1 = 26이 곱해지는 식으로 사용될 것이다.
문자열 역순 순회:
for (int i = columnString.length() - 1; i >= 0; i--): 문자열을 가장 오른쪽 문자부터 (즉, 가장 낮은 자리수부터) 왼쪽으로 순회한다.
이렇게 하면 각 자리에 올바른 powerOf26 값을 바로 곱해줄 수 있어서 편리한다.
각 문자의 값 계산:
char ch = columnString.charAt(i);: 현재 순회 중인 위치(i)의 문자를 가져온다.
int charValue = ch - 'A' + 1;:
자바에서 문자는 ASCII(또는 유니코드) 값을 가진다.
'A'는 특정 숫자 값을, 'B'는 'A'보다 1 큰 숫자 값을 가진다.
따라서 ch - 'A'는 'A'일 경우 0, 'B'일 경우 1이 된다.
문제에서는 'A'가 1로 시작하므로, 여기에 + 1을 더해준다.
결과적으로 'A'는 1, 'B'는 2, ..., 'Z'는 26의 숫자 값을 가지게 된다.
결과값 누적 및 거듭제곱 갱신:
result += charValue * powerOf26;: 현재 문자의 값(charValue)에 해당 자리수에 맞는 26의 거듭제곱 값(powerOf26)을 곱한 후, 이를 result에 더해 누적한다.
powerOf26 *= 26;: 다음 (더 왼쪽에 있는) 자리수는 현재 자리수보다 26배 큰 값을 가져야 하므로, powerOf26에 26을 곱하여 다음 반복을 준비한다.
최종 출력:
System.out.println(result);: 모든 문자열 처리가 끝나면 최종 계산된 result 값을 출력한다.
br.close();: BufferedReader 사용 후에는 리소스를 해제하기 위해 닫아주는 것이 좋다.
코드로 구현
package baekjoon.baekjoon_32;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 16495번 문제
public class Main1256 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String columnString = br.readLine(); // 열 문자열 입력 받기
long result = 0; // 결과값을 저장할 변수 (문자열 길이가 길어지면 값이 커질 수 있으므로 long 사용)
long powerOf26 = 1; // 26의 거듭제곱을 계산할 변수 (처음에는 26^0 = 1)
// 문자열의 뒤에서부터 앞으로 순회하면서 계산
for (int i = columnString.length() - 1; i >= 0; i--) {
char ch = columnString.charAt(i); // 현재 문자
// 'A'는 1, 'B'는 2, ..., 'Z'는 26에 해당하도록 변환
int charValue = ch - 'A' + 1;
result += charValue * powerOf26; // 현재 문자의 값에 26의 거듭제곱을 곱해서 결과에 더함
powerOf26 *= 26; // 다음 자리수를 위해 26의 거듭제곱을 값을 갱신합니다.
}
System.out.println(result); // 최종 결과 출력
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.