내가 생각했을때 문제에서 원하는부분
첫 번째 줄에 알파벳 대문자로 구성된 문자열이 주어진다.
문자열의 길이는 최대 100자이다.
빈 문자열은 주어지지 않는다.
입력으로 주어진 문자열을 출력하는 데에 걸리는 시간의 최솟값을 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader 객체를 생성하여 표준 입력 스트림(System.in)과 연결한다.
String inputString = br.readLine();
첫 번째 줄에 주어지는 알파벳 대문자로 구성된 문자열을 읽어서 inputString 변수에 저장한다.
int totalTime = 0;
문자열을 출력하는 데 필요한 총 최소 시간을 누적할 변수 totalTime을 0으로 초기화한다.
char currentArrow = 'A';
현재 화살표가 가리키고 있는 문자를 나타내는 currentArrow 변수를 선언하고, 문제에서 제시된 초기값인 'A'로 설정한다.
for (int i = 0; i < inputString.length(); i++) { ... }
입력받은 inputString의 각 문자를 앞에서부터 하나씩 처리하기 위한 반복문이다.
char targetChar = inputString.charAt(i);
현재 반복 횟수에 해당하는 인덱스 i의 문자를 inputString에서 가져와 targetChar에 저장한다.
이 문자가 이번에 화살표를 이동시켜야 할 목표 문자이다.
int diff = Math.abs(currentArrow - targetChar);
현재 화살표 위치(currentArrow)와 목표 문자(targetChar) 사이의 직선 거리를 계산한다.
알파벳은 연속적인 아스키 코드 값을 가지므로, 두 문자를 뺄셈하여 쉽게 거리를 구할 수 있다.
예를 들어, 'C' - 'A'는 2가 된다.
Math.abs() 함수는 양수로 거리를 얻기 위해 사용된다.
totalTime += Math.min(diff, 26 - diff);
여기서 최소 시간을 계산하는 핵심 로직이 들어간다.
diff: 현재 문자에서 목표 문자까지 한 방향으로만 이동했을 때의 거리이다 (예: 'A'에서 'C'까지는 2칸).
26 - diff: 원형 다이얼의 특성상, diff만큼 한 방향으로 가는 것 외에 다른 방향으로 가는 경로도 있다.
전체 알파벳 개수(26개)에서 diff를 뺀 값이 그 다른 방향의 이동 거리가 된다 (예: 'A'에서 'C'까지는 2칸인데, 반대 방향으로 가면 26 - 2 = 24칸).
Math.min(diff, 26 - diff): 이 두 가지 경로 중 더 짧은 거리를 선택한다.
이 값을 totalTime에 더하여 누적합한다.
currentArrow = targetChar;
한 문자를 처리했으면, 다음 문자를 처리하기 위해 화살표의 현재 위치를 방금 출력한 targetChar로 업데이트해준다.
System.out.println(totalTime);
반복문이 모두 끝나면 계산된 totalTime, 즉 주어진 문자열을 출력하는 데 걸리는 최소 시간을 출력한다.
br.close();
사용했던 BufferedReader 객체를 닫아 리소스를 해제한다.
코드로 구현
package baekjoon.baekjoon_30;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 18238번 문제
public class Main1142 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputString = br.readLine(); // 입력 문자열을 읽어옵니다.
int totalTime = 0; // 총 소요 시간을 저장할 변수
char currentArrow = 'A'; // 현재 화살표가 가리키는 문자 (초기 'A')
// 문자열의 각 문자를 순회합니다.
for(int i = 0; i < inputString.length(); i++) {
char targetChar = inputString.charAt(i); // 이번에 출력할 목표 문자
// 현재 문자(currentArrow)와 목표 문자(targetChar) 사이의 절대 거리 (칸 수)를 계산합니다.
// 아스키 코드 값을 이용하면 문자와 문자 사이의 거리를 쉽게 계산할 수 있습니다.
// 예: 'C' - 'A' = 2
int diff = Math.abs(currentArrow - targetChar);
// 두 가지 회전 경로 중 더 짧은 것을 선택합니다.
// 1. diff 만큼 직접 이동 (시계 또는 반시계 방향 중 하나)
// 2. (26 - diff) 만큼 다른 방향으로 이동
totalTime += Math.min(diff, 26 - diff);
// 다음 문자를 위해 현재 화살표 위치를 목표 문자로 업데이트합니다.
currentArrow = targetChar;
}
System.out.println(totalTime); // 최종 최소 시간 출력
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.